Sign inGet started

Verbindingen van een member beëindigen

Kanaalauthorisatie beheert abonnementen, maar wijst geen identiteit op verbindingsniveau toe. Zonder die identiteit sluit uitloggen elders geen bestaande socket en worden de kanaalabonnementen niet verwijderd.
Roep signin() aan om de verbinding een member_id toe te wijzen vanuit je backend. De disconnect-operatie kan dan alle verbindingen sluiten die dat member op de app heeft.
Gebruik deze flow na een uitloggen op afstand, tokenintrekking, blokkade, wachtwoordwijziging of verwijdering van een werkruimte-seat.

1. Log de verbinding in

Verwijs de client naar een endpoint op je eigen backend en roep signin() eenmaal aan:
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);
De identiteit hoort bij de verbinding. Roep signin() eenmaal aan; de client logt opnieuw in na elke reconnect.
Inloggen autoriseert geen kanaalabonnementen. Privé- en presence-kanalen roepen nog steeds je kanaalauthorisatie-endpoint aan. Een verbinding zonder member-identiteit kan zich abonneren op elk kanaal dat het endpoint goedkeurt. Zie Kanalen autoriseren.

2. Onderteken de identiteit vanuit je backend

De client stuurt de verbindings-ID in een POST-request:
Codevoorbeeld
{ "connection_id": "26896.319537" }
Je endpoint antwoordt met de identiteit als een JSON string, plus een handtekening over exact die string:
Codevoorbeeld
{
  "auth": "your-app-key:8f9a…",
  "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Ada\"}}"
}
De te ondertekenen string is <connection_id>::member::<member_data>, met twee dubbele punten aan elke kant van member. Pas HMAC-SHA256 toe met het app-secret, hex-encodeer het resultaat en voeg de app-key als prefix toe:
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 });
});
Onderteken exact de member_data-string die je teruggeeft. Het object opnieuw serialiseren kan de bytes veranderen en de handtekening ongeldig maken.
member_id is de waarde waar de disconnect-operatie op richt. Het accepteert maximaal 128 URL-veilige tekens, waaronder + : @ . _ -, maar niet / ? # % of witruimte. Als je identifier niet-ondersteunde tekens bevat, vertaal die dan naar een stabiele veilige waarde voordat je ondertekent. De edge wijst een ongeldige member-ID af, waardoor de verbinding zonder een identiteit blijft die de disconnect-operatie kan richten.
member_info is optioneel. Bij het inloggen van een verbinding wordt het naar die client teruggestuurd in plaats van uitgezonden naar een presence-kanaal.
De identiteit kan ook een watchlist-array met member-id's bevatten. Op apps met watchlist_events ingeschakeld krijgt de verbinding een melding wanneer die members online of offline gaan; zie Watchlist-events.
De hier ondertekende string is bewust niet dezelfde string die een presence-abonnement ondertekent, zodat een presence-autorisatie nooit kan worden hergebruikt om een identiteit te claimen, ook al heten beide payloads member_data.

3. Verbreek de verbinding van het member

await bird.realtime.members.disconnect("rap_01krdgeqcxet5s7t44vh8rt9mg", "u_42");
De operatie sluit alle ingelogde verbindingen voor dat member op de app, inclusief andere tabbladen en apparaten. Anonieme verbindingen of verbindingen die aan een ander member zijn toegewezen worden niet gesloten.

Wat de client ziet

De verbinding wordt gesloten met code 4009 en maakt niet automatisch opnieuw verbinding:
bird.connection.bind("error", (e) => {
  if (e.code === 4009) showSignedOutScreen();
});
Toon een uitgelogde status wanneer de authenticatie is beëindigd. bird.connect() aanroepen start een nieuwe verbinding die via je endpoint inlogt, dus maak pas opnieuw verbinding nadat de autorisatiestatus van het member verandert.
Een mislukte inlogpoging sluit de socket niet. De client meldt de fout apart en laat de verbinding zonder member-identiteit. Na een reconnect meldt de client dit via signin_error omdat de oorspronkelijke signin()-promise al is opgelost.
bird.connection.bind("signin_error", (e) => {
  console.warn("connection has no identity:", e.message);
});
De verbinding kan nog steeds events ontvangen van geautoriseerde kanalen, maar member-event- en disconnect-operaties kunnen er niet op richten. In de browserclient is bird.signedInMember gelijk aan null in deze toestand.

Opnieuw verbinden voorkomen

De disconnect-operatie sluit huidige verbindingen zonder een permanente blokkade aan te maken. Dezelfde client kan opnieuw verbinding maken.
Trek de sessie in of registreer de blokkade voordat je het member verbreekt. Je member-autorisatie-endpoint kan dan 403 Forbidden teruggeven als de client opnieuw verbinding maakt.

Volgende stappen

Gerelateerde bronnen

Ga verder met de documentatie, gidsen en voorbeelden voor dit onderwerp. De bronnen zijn in het Engels.

Probeer de oefening en ontvang een implementatieoverzicht