Contrôlez qui se connecte et s'abonne grâce à vos règles de session existantes.
Envoyez des mises à jour de commande privées, des alertes de compte et des événements d'espace de travail aux clients web et mobiles sans exposer d'identifiants backend dans le code client. Votre propre endpoint d'authentification vérifie la session de l'appelant et signe les abonnements aux canaux privés ou de présence pour chaque connexion, tandis que le chiffrement de bout en bout protège les données sensibles avant qu'elles ne quittent votre serveur.
auth.ts
200 · signé403 · Forbidden200 · signé200 · signé// Your endpoint. The only place the app secret lives.app.post("/bird/auth", async (req, res) => { const { connection_id, channel_name } = req.body; const user = await session(req); if (!mayJoin(user, channel_name)) return res.sendStatus(403); // Signs <connection_id>:<channel_name>[:<member_data>] with the app // secret, and adds shared_secret on an encrypted channel. res.json( await bird.realtime.authorizeChannel({ connectionId: connection_id, channelName: channel_name, memberData: JSON.stringify({ member_id: user.id, member_info: { name: user.name }, }), }), );});
POST/bird/auth
Corps de la réponse
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · signé403 · Forbidden200 · signé200 · signé// Your endpoint. The only place the app secret lives.app.post("/bird/auth", async (req, res) => { const { connection_id, channel_name } = req.body; const user = await session(req); if (!mayJoin(user, channel_name)) return res.sendStatus(403); // Signs <connection_id>:<channel_name>[:<member_data>] with the app // secret, and adds shared_secret on an encrypted channel. res.json( await bird.realtime.authorizeChannel({ connectionId: connection_id, channelName: channel_name, memberData: JSON.stringify({ member_id: user.id, member_info: { name: user.name }, }), }), );});
POST/bird/auth
Corps de la réponse
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · signé403 · Forbidden200 · signé200 · signé// Your endpoint. The only place the app secret lives.app.post("/bird/auth", async (req, res) => { const { connection_id, channel_name } = req.body; const user = await session(req); if (!mayJoin(user, channel_name)) return res.sendStatus(403); // Signs <connection_id>:<channel_name>[:<member_data>] with the app // secret, and adds shared_secret on an encrypted channel. res.json( await bird.realtime.authorizeChannel({ connectionId: connection_id, channelName: channel_name, memberData: JSON.stringify({ member_id: user.id, member_info: { name: user.name }, }), }), );});
POST/bird/auth
Corps de la réponse
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
Fournissez une clé publique aux clients
tout en gardant les secrets de signature sur votre serveur.
Une application sur l<hub>API Realtime de Bird</hub> sépare les identifiants de connexion des clients de lautorité du backend. Les navigateurs et les applications mobiles ouvrent des WebSockets avec une clé d'application publique que vous pouvez intégrer sans risque dans les bundles clients, tandis que votre backend détient le secret utilisé pour publier des événements et signer les jetons d'abonnement. Lorsque votre politique de sécurité exige une rotation des identifiants, vous pouvez créer une seconde paire de clés, la déployer sur vos services, puis révoquer l'ancienne paire sans déconnecter les utilisateurs actifs.
Protégez connexions, canaux et données à chaque niveau
Vérifiez qui peut ouvrir un socket, autorisez les canaux qu'il rejoint, chiffrez les données d'événement sensibles et coupez l'accès à la fin d'une session.
- 01
Abonnements aux canaux signés.
Lorsqu'un client web ou mobile s'abonne à un canal privé ou de présence, votre backend vérifie la session de l'utilisateur et signe un jeton HMAC-SHA256 lié à cet identifiant de connexion et à ce nom de canal précis. Lier la signature à l'identifiant du socket empêche de rejouer un jeton sur une autre connexion, et les signatures de présence fixent aussi l'identité du membre affichée dans le salon.
- 02
Connexions WebSocket authentifiées.
Votre clé d'application publique se trouvant dans le code client, n'importe quel visiteur peut tenter d'ouvrir un WebSocket inactif. Si vous activez les connexions autorisées, chaque nouveau socket doit s'authentifier auprès de votre backend dans un délai de 30 secondes, en se connectant ou en s'abonnant à un canal privé. Les sockets non vérifiés se ferment automatiquement et ne sont pas décomptés de votre quota de connexions.
- 03
Données chiffrées de bout en bout.
Pour les mises à jour réglementées ou confidentielles, le SDK serveur chiffre localement les données des événements avec une clé maîtresse de 32 octets qui reste sur votre infrastructure. Chaque canal chiffré dérive sa propre clé de déchiffrement : autoriser un client sur un flux confidentiel ne lui donne donc pas accès à un autre, et les serveurs intermédiaires ne voient que du texte chiffré en transit.
- 04
Révocation de session instantanée.
Lorsqu'un utilisateur se déconnecte, change de mot de passe ou perd l'accès à l'espace de travail, un seul appel serveur déconnecte son identité de membre sur tous les onglets de navigateur et appareils mobiles ouverts. Les clients considèrent cette fin de connexion comme définitive au lieu de se reconnecter en boucle, et votre endpoint d'authentification peut refuser les tentatives de connexion suivantes une fois la session révoquée.
Canaux chiffrés
Chiffrez les données sensibles avant qu'elles ne quittent votre serveur.
Configurez une clé maîtresse de 32 octets dans le SDK serveur pour chiffrer les événements confidentiels dans votre propre processus avant leur publication. Bird achemine l'enveloppe chiffrée vers les abonnés, et votre endpoint d'autorisation transmet la clé de déchiffrement dérivée du canal aux clients web autorisés. Vous pouvez aussi combiner le chiffrement avec la mise en cache du dernier événement afin que les clients nouvellement connectés reçoivent l'état le plus récent sous forme chiffrée. Gardez toutefois des noms de canaux et d'événements génériques, car les métadonnées de routage ne sont pas chiffrées.
const bird = new BirdClient({
apiKey: process.env.BIRD_API_KEY!,
realtime: {
key: process.env.BIRD_REALTIME_KEY,
secret: process.env.BIRD_REALTIME_SECRET,
// 32 random bytes, yours alone. Never sent to Bird.
encryptionMasterKey: process.env.BIRD_REALTIME_MASTER_KEY,
},
});
// Sealed in your process. The edge forwards ciphertext.
await bird.realtime.publish(APP_ID, {
event: "order.updated",
channels: ["private-encrypted-orders"],
data: { order_id: "ord_123", status: "shipped" },
});
Isolez les flux de chaque client et validez l'état sur votre serveur.
L'authentification des connexions et l'autorisation des canaux couvrent des aspects différents du contrôle d'accès. Exiger des connexions autorisées bloque les sockets anonymes, tandis que les canaux privés et de présence limitent l'utilisateur connecté ou le client autorisé à lire un flux donné. Diffusez les mises à jour propres à chaque client sur des canaux privés vérifiés par votre endpoint d'authentification, utilisez les événements de client à client pour les signaux d'interface éphémères comme les indicateurs de saisie, et faites passer les actions qui modifient l'état par votre backend.
Fixez le trafic dans une région et isolez les environnements par application.
Choisissez une région dédiée lors de la création d'une application Realtime pour garder les connexions WebSocket et les événements publiés au plus près de vos utilisateurs, même si la région principale de votre espace de travail est ailleurs. Chaque application s'exécutant dans son propre espace de noms isolé, avec des identifiants et des quotas distincts, créer des applications séparées pour le développement, la préproduction et la production empêche les diffusions de test d'atteindre les canaux des clients en production.
Guides d'implémentation pour votre backend.
Consultez l'autorisation des canaux pour le format des requêtes webhook et les fonctions de signature du SDK. Lisez l'exigence de connexions autorisées pour imposer la négociation de connexion de 30 secondes, les canaux chiffrés pour configurer les clés maîtresses et leur rotation, et la fin des connexions des membres pour mettre en place la connexion des utilisateurs et la déconnexion à distance.
Continuez à développer
avec Realtime.
Combinez l'autorisation des canaux avec la présence en direct, la mise en cache de l'état et les webhooks backend, avec les mêmes identifiants d'application.
Canaux
Acheminez diffusions publiques, flux privés, données chiffrées et état en cache selon le préfixe du canal.
→Présence
Affichez qui est en ligne sur tous les onglets et appareils, suivez les départs et envoyez des messages directement à chaque utilisateur.
→Webhooks
Déclenchez des workflows backend lorsque des canaux deviennent actifs, que des membres partent ou qu'un cache doit être préchargé.
→Passez à l'échelle sans perdre le contrôle.
Separate production and sandbox traffic into dedicated workspaces, scope API keys to the exact channels each service or agent needs, and track permission changes in the audit log.