Authentifier et connecter les clients

Un client se connecte à Chat avec une URL d’accès client qui porte son identité utilisateur. Celui qui émet le jeton décide de l’identifiant utilisateur, donc c’est le jeton qui relie un utilisateur du chat à une véritable identité dans votre application.

Cet article montre deux façons d’obtenir un jeton : une rapide via le portail Azure pour expérimenter, et des jetons émis par le serveur pour la production.

Option 1 : Obtenir un jeton sur le portail (essai rapide)

Pour des tests rapides, générez une URL d’accès client dans le portail. Il n’a pas besoin de code, mais l’URL est statique et expire, donc utilisez-la uniquement pour expérimenter. Pour les instructions étape par étape du portail, voir Obtenir un jeton d’accès client depuis le portail.

Option 2 : Émettre un jeton depuis votre serveur (production)

En production, votre propre serveur émet des jetons. Cela permet de conserver vos clés Web PubSub sur le serveur et vous permet de définir l’identifiant utilisateur de chaque client depuis l’utilisateur connecté plutôt que depuis l’entrée du client.

Ajoutez un point de terminaison négocié

Le serveur expose un point de terminaison qui renvoie une URL d’accès client. Cet exemple utilise Node.js avec Express et le SDK serveur Web PubSub.

Choisissez comment le serveur s’authentifie sur 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

Cet exemple lit l’identifiant utilisateur de la chaîne de requête pour la garder courte. En production, il faut définir l’identifiant utilisateur de l’utilisateur authentifié (par exemple, de sa session), jamais à partir des entrées du client. Sinon, un appelant pourrait demander un jeton pour n’importe quel identifiant utilisateur.

Connecte le client

Donnez au SDK client un rappel qui récupère une URL depuis votre terminaison. Le SDK l’appelle à nouveau chaque fois qu’il a besoin d’un nouveau jeton, par exemple après une reconnexion.

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

Durée de vie du token et rafraîchissement

Les jetons d’accès client expirent. Une URL du portail et une URL provenant de getClientAccessToken sont toutes deux valides pendant 60 minutes par défaut.

  • Avec une URL statique (Option 1), le client ne peut pas se reconnecter après l’expiration du jeton. C’est parfait pour des tests rapides.
  • Avec une fonction de rappel (option 2), le SDK demande une nouvelle URL à votre serveur à chaque reconnexion, de sorte que les clients de longue durée continuent de fonctionner sans que vous ayez à suivre l’expiration.

Pour changer la durée de vie, réglez expirationTimeInMinutes quand vous appelez getClientAccessToken.

Étapes suivantes