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

Continua con la documentazione, le guide e gli esempi per questo argomento.