Sign inGet started

Fermer les connexions d'un membre

L'autorisation de canal contrôle les abonnements, mais n'attribue pas d'identité au niveau de la connexion. Sans cette identité, une déconnexion effectuée ailleurs ne ferme pas un socket existant et ne supprime pas ses abonnements aux canaux.
Appelez signin() pour attribuer à la connexion un member_id depuis votre backend. L'opération de déconnexion peut alors fermer toutes les connexions que ce membre détient sur l'application.
Utilisez ce flux après une déconnexion à distance, une révocation de jeton, un bannissement, un changement de mot de passe ou un retrait de siège dans l'espace de travail.

1. Connecter la connexion

Dirigez le client vers un endpoint sur votre propre backend et appelez signin() une seule fois :
import { BirdRealtime } from "@messagebird/realtime";

const bird = new BirdRealtime({
  appKey: "your-app-key",
  region: "us1",
  memberAuthEndpoint: "/bird/auth/member",
});

const member = await bird.signin();
console.log("signed in as", member.member_id);
L'identité appartient à la connexion. Appelez signin() une seule fois ; le client se reconnecte après chaque reconnexion.
La connexion n'autorise pas les abonnements aux canaux. Les canaux privés et de présence appellent toujours votre endpoint d'autorisation de canal. Une connexion sans identité de membre peut s'abonner à tout canal approuvé par cet endpoint. Voir Autoriser les canaux.

2. Signer l'identité depuis votre backend

Le client envoie l'identifiant de connexion dans une requête POST :
Exemple de code
{ "connection_id": "26896.319537" }
Votre endpoint répond avec l'identité sous forme de JSON chaîne, accompagnée d'une signature portant sur cette chaîne exacte :
Exemple de code
{
  "auth": "your-app-key:8f9a…",
  "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Ada\"}}"
}
La chaîne à signer est <connection_id>::member::<member_data>, avec deux deux-points de chaque côté de member. Appliquez HMAC-SHA256 avec le secret de l'application, encodez en hexadécimal et préfixez la clé de l'application :
import { createHmac } from "node:crypto";

app.post("/bird/auth/member", (req, res) => {
  const { connection_id } = req.body;

  // Your own decision: who is this caller, and may they connect at all?
  const user = getUserFromSession(req);
  if (!user) return res.sendStatus(403);

  const memberData = JSON.stringify({
    member_id: user.id,
    member_info: { name: user.name },
  });
  const sig = createHmac("sha256", process.env.BIRD_REALTIME_SECRET)
    .update(`${connection_id}::member::${memberData}`)
    .digest("hex");

  res.json({ auth: `${process.env.BIRD_REALTIME_KEY}:${sig}`, member_data: memberData });
});
Signez la chaîne member_data exacte que vous retournez. Re-sérialiser l'objet peut modifier ses octets et invalider la signature.
member_id est la valeur ciblée par l'opération de déconnexion. Elle accepte jusqu'à 128 caractères sûrs pour les URL, y compris + : @ . _ -, mais pas / ? # % ni les espaces. Si votre identifiant contient des caractères non pris en charge, convertissez-le en une valeur sûre et stable avant de signer. Le serveur edge rejette un identifiant de membre invalide, laissant la connexion sans identité que l'opération de déconnexion puisse cibler.
member_info est facultatif. Pour la connexion d'un membre, il est renvoyé à ce client plutôt que diffusé sur un canal de présence.
L'identité peut aussi contenir un tableau watchlist d'identifiants de membres. Sur les applications avec watchlist_events activé, la connexion est alors informée lorsque ces membres se connectent ou se déconnectent ; voir Événements de liste de suivi.
La chaîne signée ici est volontairement différente de celle qu'un abonnement de présence signe, de sorte qu'une autorisation de présence ne puisse jamais être rejouée pour revendiquer une identité, même si les deux charges utiles s'appellent member_data.

3. Déconnecter le membre

await bird.realtime.members.disconnect("rap_01krdgeqcxet5s7t44vh8rt9mg", "u_42");
L'opération ferme toutes les connexions authentifiées de ce membre sur l'application, y compris les autres onglets et appareils. Elle ne ferme pas les connexions anonymes ni les connexions attribuées à un autre membre.

Ce que le client observe

La connexion se ferme avec le code 4009 et ne se reconnecte pas automatiquement :
bird.connection.bind("error", (e) => {
  if (e.code === 4009) showSignedOutScreen();
});
Affichez un état déconnecté lorsque l'authentification a pris fin. L'appel à bird.connect() démarre une nouvelle connexion qui s'authentifie via votre endpoint ; ne reconnectez donc qu'après un changement de l'état d'autorisation du membre.
Un échec de connexion ne ferme pas le socket. Le client signale l'échec séparément et laisse la connexion sans identité de membre. Après une reconnexion, le client le signale via signin_error car la promesse signin() d'origine a déjà été résolue.
bird.connection.bind("signin_error", (e) => {
  console.warn("connection has no identity:", e.message);
});
La connexion peut toujours recevoir des événements des canaux autorisés, mais les opérations d'événements de membre et de déconnexion ne peuvent pas la cibler. Dans le client navigateur, bird.signedInMember vaut null dans cet état.

Empêcher la reconnexion

L'opération de déconnexion ferme les connexions en cours sans créer de blocage persistant. Le même client peut se reconnecter.
Révoquez la session ou enregistrez le bannissement avant de déconnecter le membre. Votre endpoint d'autorisation de membre peut alors renvoyer 403 Forbidden si le client se reconnecte.

Étapes suivantes