Steuern Sie, wer sich verbindet und abonniert, mit Ihren bestehenden Sitzungsregeln.
Liefern Sie private Bestellupdates, Kontowarnungen und Workspace-Ereignisse an Browser- und Mobile-Clients, ohne Backend-Zugangsdaten im Client-Code offenzulegen. Ihr eigener Auth-Endpunkt prüft die Sitzung des Aufrufers und signiert Abonnements privater oder Presence-Kanäle pro Verbindung. Die Ende-zu-Ende-Verschlüsselung versiegelt sensible Payloads, bevor sie Ihren Server verlassen.
auth.ts
200 · signiert403 · Forbidden200 · signiert200 · signiert// 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
Antwort-Body
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · signiert403 · Forbidden200 · signiert200 · signiert// 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
Antwort-Body
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · signiert403 · Forbidden200 · signiert200 · signiert// 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
Antwort-Body
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
Geben Sie Clients einen öffentlichen Schlüssel
und behalten Sie die Signierschlüssel auf Ihrem Server.
Eine App auf der Bird Realtime API trennt die Zugangsdaten für Client-Verbindungen von den Backend-Befugnissen. Browser und mobile Apps öffnen WebSockets mit einem öffentlichen App-Schlüssel, den Sie gefahrlos in Client-Bundles einbetten können. Ihr Backend verwahrt das Secret, mit dem es Ereignisse veröffentlicht und Abonnement-Tokens signiert. Wenn Ihre Sicherheitsrichtlinie eine Rotation der Zugangsdaten verlangt, erstellen Sie ein zweites Schlüsselpaar, rollen es in Ihren Diensten aus und widerrufen das vorherige Paar, ohne aktive Nutzer zu trennen.
Schützen Sie Verbindungen, Kanäle und Payloads auf jeder Ebene
Prüfen Sie, wer einen Socket öffnen darf, autorisieren Sie, welchen Kanälen jemand beitritt, verschlüsseln Sie sensible Ereignisdaten und sperren Sie den Zugriff, sobald eine Sitzung endet.
- 01
Signierte Kanalabonnements.
Wenn ein Browser- oder Mobile-Client einen privaten oder Presence-Kanal abonniert, prüft Ihr Backend die Sitzung des Nutzers und signiert ein HMAC-SHA256-Token, das an genau diese Verbindungs-ID und diesen Kanalnamen gebunden ist. Da die Signatur an die Socket-ID gebunden ist, lässt sich ein Token nicht auf einer anderen Verbindung wiederverwenden. Presence-Signaturen legen zudem die Mitgliedsidentität fest, die im Raum angezeigt wird.
- 02
Authentifizierte WebSocket-Verbindungen.
Da Ihr öffentlicher App-Schlüssel im Client-Code liegt, könnte jeder Besucher versuchen, einen inaktiven WebSocket zu öffnen. Wenn Sie autorisierte Verbindungen aktivieren, muss sich ein neuer Socket innerhalb von 30 Sekunden über Ihr Backend authentifizieren, entweder per Anmeldung oder durch das Abonnieren eines privaten Kanals. Nicht verifizierte Sockets werden automatisch geschlossen und zählen nicht zu Ihrem Verbindungskontingent.
- 03
Ende-zu-Ende-verschlüsselte Payloads.
Für regulierte oder vertrauliche Updates verschlüsselt das Server-SDK Ereignis-Payloads lokal mit einem 32-Byte-Hauptschlüssel, der in Ihrer Infrastruktur bleibt. Jeder verschlüsselte Kanal leitet seinen eigenen Entschlüsselungsschlüssel ab. Wer für einen vertraulichen Stream freigegeben ist, erhält daher keinen Zugriff auf einen anderen. Zwischengeschaltete Server sehen während der Übertragung nur Chiffretext.
- 04
Sofortiger Widerruf von Sitzungen.
Wenn sich ein Nutzer abmeldet, sein Passwort ändert oder den Zugriff auf den Workspace verliert, trennt ein einziger Serveraufruf seine Mitgliedsidentität in allen offenen Browser-Tabs und auf allen Mobilgeräten. Clients behandeln die Trennung als endgültig, statt sich in einer Schleife neu zu verbinden. Ihr Auth-Endpunkt kann weitere Anmeldeversuche ablehnen, sobald die Sitzung widerrufen ist.
Verschlüsselte Channels
Versiegeln Sie sensible Payloads, bevor sie Ihren Server verlassen.
Konfigurieren Sie im Server-SDK einen 32-Byte-Hauptschlüssel, um vertrauliche Ereignisse vor dem Veröffentlichen in Ihrem eigenen Prozess zu verschlüsseln. Bird leitet den versiegelten Umschlag an die Abonnenten weiter, und Ihr Autorisierungsendpunkt liefert den abgeleiteten Entschlüsselungsschlüssel des Kanals an freigegebene Browser-Clients. Sie können die Verschlüsselung auch mit dem Caching des letzten Ereignisses kombinieren, sodass neu verbundene Clients den aktuellen Stand als Chiffretext erhalten. Halten Sie Kanal- und Ereignisnamen dabei allgemein, denn Routing-Metadaten bleiben unverschlüsselt.
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" },
});
Isolieren Sie Mandanten-Streams und validieren Sie Zustände auf Ihrem Server.
Verbindungsauthentifizierung und Kanalautorisierung decken unterschiedliche Teile der Zugriffskontrolle ab. Autorisierte Verbindungen blockieren anonyme Sockets, während private und Presence-Kanäle festlegen, welcher angemeldete Nutzer oder Mandant einen bestimmten Stream lesen darf. Senden Sie kundenspezifische Updates über private Kanäle, die Ihr Auth-Endpunkt verifiziert. Nutzen Sie Client-zu-Client-Ereignisse für flüchtige UI-Signale wie Tippindikatoren, und leiten Sie zustandsändernde Aktionen über Ihr Backend.
Binden Sie Traffic an eine Region und trennen Sie Umgebungen per App.
Wählen Sie beim Erstellen einer Realtime-App eine dedizierte Region, damit WebSocket-Verbindungen und veröffentlichte Ereignisse nah bei Ihren Nutzern bleiben, auch wenn die Heimatregion Ihres Workspace anderswo liegt. Jede App läuft in einem eigenen isolierten Namespace mit separaten Zugangsdaten und Kontingenten. Mit getrennten Apps für Entwicklung, Staging und Produktion gelangen Test-Broadcasts daher nicht in Live-Kundenkanäle.
Implementierungsleitfäden für Ihr Backend.
Unter Kanäle autorisieren finden Sie das Format der Webhook-Anfrage und die Signierhilfen des SDK. Unter Autorisierte Verbindungen erzwingen setzen Sie den 30-Sekunden-Verbindungshandshake durch, unter Verschlüsselte Kanäle konfigurieren Sie Hauptschlüssel und Schlüsselrotation, und unter Mitgliedsverbindungen beenden richten Sie Nutzeranmeldung und Remote-Trennung ein.
Entwickeln Sie weiter
mit Realtime.
Kombinieren Sie Kanalautorisierung mit Live-Presence, Zustands-Caching und Backend-Webhooks, alles mit denselben App-Zugangsdaten.
Channels
Leiten Sie öffentliche Broadcasts, private Streams, verschlüsselte Payloads und gecachte Zustände per Kanalpräfix.
→Presence
Zeigen Sie, wer über Tabs und Geräte hinweg online ist, verfolgen Sie Abgänge und senden Sie einzelnen Nutzern direkt Nachrichten.
→Webhooks
Starten Sie Backend-Workflows, wenn Kanäle aktiv werden, Mitglieder gehen oder ein Cache vorgewärmt werden muss.
→Skalieren, ohne
die Kontrolle zu verlieren.
Organisieren Sie Teams in Workspaces, steuern Sie den API-Zugriff und verfolgen Sie Änderungen über Audit-Logs.
Organisation
Harbor
Zugriff bleibt in seinem Workspace.
Produktion/API-Schlüssel
Hafen-Backend
AktivAlex Lee
Admin
Heute · UTC
Audit-Protokoll
Organisation
Harbor
Zugriff bleibt in seinem Workspace.
Produktion/API-Schlüssel
Hafen-Backend
AktivAlex Lee
Admin
Heute · UTC
Audit-Protokoll
Organisation
Harbor
Zugriff bleibt in seinem Workspace.
Produktion/API-Schlüssel
Hafen-Backend
AktivAlex Lee
Admin
Heute · UTC
Audit-Protokoll