Sign inGet started

Terminare le connessioni di un membro

L'autorizzazione del canale controlla le sottoscrizioni ma non assegna un'identità a livello di connessione. Senza quell'identità, effettuare il sign-out altrove non chiude un socket esistente né rimuove le sue sottoscrizioni ai canali.
Chiama signin() per assegnare alla connessione un member_id dal tuo backend. L'operazione di disconnessione può quindi chiudere tutte le connessioni che quel membro detiene sull'app.
Usa questo flusso dopo un sign-out remoto, una revoca di token, un ban, un cambio di password o la rimozione di un posto nello spazio di lavoro.

1. Effettua il sign-in della connessione

Indirizza il client a un endpoint sul tuo backend e chiama signin() una sola volta:
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à appartiene alla connessione. Chiama signin() una sola volta: il client effettua di nuovo il sign-in dopo ogni riconnessione.
Il sign-in non autorizza le sottoscrizioni ai canali. I canali privati e di presenza continuano a chiamare il tuo endpoint di autorizzazione del canale. Una connessione senza identità membro può sottoscriversi a qualsiasi canale approvato da quell'endpoint. Vedi Autorizzazione dei canali.

2. Firma l'identità dal tuo backend

Il client invia l'ID di connessione in una richiesta POST:
Esempio di codice
{ "connection_id": "26896.319537" }
Il tuo endpoint risponde con l'identità come JSON stringa, più una firma su quella stringa esatta:
Esempio di codice
{
  "auth": "your-app-key:8f9a…",
  "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Ada\"}}"
}
La stringa da firmare è <connection_id>::member::<member_data>, con due due punti su ciascun lato di member. Applica HMAC-SHA256 con l'app secret, codifica in esadecimale e aggiungi come prefisso l'app key:
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 });
});
Firma la stringa member_data esatta che restituisci. Riserializzare l'oggetto può modificarne i byte e invalidare la firma.
member_id è il valore preso di mira dall'operazione di disconnessione. Accetta fino a 128 caratteri URL-safe, incluso + : @ . _ -, ma non / ? # % né spazi bianchi. Se il tuo identificatore contiene caratteri non supportati, mappalo su un valore sicuro e stabile prima di firmare. L'edge rifiuta un member ID non valido, lasciando la connessione senza un'identità che l'operazione di disconnessione possa prendere di mira.
member_info è opzionale. Per il sign-in della connessione, viene restituito a quel client anziché trasmesso a un canale di presenza.
L'identità può anche includere un array watchlist di member id. Nelle app con watchlist_events abilitato, la connessione viene informata quando quei membri vanno online o offline; vedi Eventi della watchlist.
La stringa firmata qui è volutamente diversa dalla stringa firmata da una sottoscrizione di presenza, così un'autorizzazione di presenza non può mai essere riutilizzata per rivendicare un'identità, anche se entrambi i payload si chiamano member_data.

3. Disconnetti il membro

await bird.realtime.members.disconnect("rap_01krdgeqcxet5s7t44vh8rt9mg", "u_42");
L'operazione chiude tutte le connessioni con sign-in attivo per quel membro sull'app, incluse altre schede e dispositivi. Non chiude connessioni anonime né connessioni assegnate a un altro membro.

Cosa vede il client

La connessione si chiude con il codice 4009 e non si riconnette automaticamente:
bird.connection.bind("error", (e) => {
  if (e.code === 4009) showSignedOutScreen();
});
Mostra uno stato di sign-out quando l'autenticazione è terminata. Chiamare bird.connect() avvia una nuova connessione che effettua il sign-in tramite il tuo endpoint, quindi riconnettiti solo dopo che lo stato di autorizzazione del membro cambia.
Un errore di sign-in non chiude il socket. Il client segnala l'errore separatamente e lascia la connessione senza identità membro. Dopo una riconnessione, il client lo segnala tramite signin_error perché la promise signin() originale è già stata risolta.
bird.connection.bind("signin_error", (e) => {
  console.warn("connection has no identity:", e.message);
});
La connessione può ancora ricevere eventi dai canali autorizzati, ma le operazioni di member-event e di disconnessione non possono prenderla di mira. Nel client browser, bird.signedInMember è null in questo stato.

Impedire la riconnessione

L'operazione di disconnessione chiude le connessioni correnti senza creare un blocco persistente. Lo stesso client può connettersi di nuovo.
Revoca la sessione o registra il ban prima di disconnettere il membro. Il tuo endpoint di autorizzazione del membro può quindi restituire 403 Forbidden se il client si riconnette.

Prossimi passi