クライアントの認証と接続

クライアントはユーザーIDを持つ クライアントアクセスURL でチャットに接続します。 トークンを発行した人がユーザーIDを決定します。つまりトークンはチャットユーザーをアプリ内の実際のIDに紐づけるものです。

この記事では、Azureポータルから実験用のクイックトークンと、本番環境用にサーバー発行トークンを取得する2つの方法を示しています。

選択肢1:ポータルからトークンを入手(クイックトライ)

簡単なテストのために、ポータルでクライアントアクセスURLを生成してください。 コードは不要ですが、URLは静的で期限切れなので、実験用に使うだけです。 ステップバイステップのポータルの手順については、「 ポータルからクライアントアクセストークンを取得する」をご覧ください。

オプション2:サーバー(本番環境)からトークンを発行する

本番環境では、自分のサーバーがトークンを発行します。 これによりWeb PubSubキーはサーバーに保存され、クライアント入力ではなくサインイン済みユーザーから各クライアントのユーザーIDを設定できます。

ネゴシエート エンドポイントを追加してください

サーバーはクライアントアクセスURLを返すエンドポイントを公開します。 この例ではExpressと Web PubSubサーバーSDKを組み合わせた Node.js を使用します。

サーバーがWeb PubSubに認証する方法を選択してください:

npm install express @azure/web-pubsub
import express from "express";
import { WebPubSubServiceClient } from "@azure/web-pubsub";

// Keep your connection string safe.
const connectionString = process.env.WebPubSubConnectionString;
const hubName = "chat"; // the hub where you enabled Chat

const app = express();
const serviceClient = new WebPubSubServiceClient(connectionString, hubName);

app.get("/negotiate", async (req, res) => {
  const userId = req.query.userId;
  if (!userId) {
    return res.status(400).json({ error: "userId is required" });
  }

  const token = await serviceClient.getClientAccessToken({ userId });
  res.json({ url: token.url });
});

app.listen(3000, () => console.log("Listening on http://localhost:3000"));

Important

この例では、クエリ文字列からユーザーIDを読み取って簡潔にまとめています。 本番環境では、ユーザーIDは認証済みユーザー(例えばそのセッション)から設定し、クライアント入力からは設定しないでください。 そうでなければ、発信者は任意のユーザーIDに対してトークンを要求できます。

クライアントを接続してください

クライアントSDKにエンドポイントからURLを取得するコールバックを与えます。 SDKは、再接続後など新しいトークンが必要なときに再度呼び出します。

const client = await ChatClient.start({
  getClientAccessUrl: async () => {
    const res = await fetch("/negotiate?userId=alice");
    const data = await res.json();
    return data.url;
  },
});

トークン寿命と更新

クライアントアクセストークンは期限切れになります。 ポータルのURLと getClientAccessToken のURLはどちらもデフォルトで60分間有効です。

  • 静的URL(オプション1)では、トークンの期限切れ後にクライアントは再接続できません。 簡単なテストにはそれで十分です。
  • コールバック(オプション2)では、SDKが再接続するたびにサーバーから新しいURLを要求するため、長寿命のクライアントは期限を追跡せずに動作し続けます。

有効期間を変更するには、expirationTimeInMinutes を呼び出すときに getClientAccessToken を設定します。

次のステップ

ルームの作成を管理を行います。