Controla quién se conecta y se suscribe con tus reglas de sesión actuales.
Envía actualizaciones privadas de pedidos, alertas de cuenta y eventos del espacio de trabajo a clientes web y móviles sin exponer credenciales del backend en el código del cliente. Tu propio endpoint de autenticación comprueba la sesión de quien llama y firma las suscripciones a canales privados o de presencia para cada conexión, mientras el cifrado de extremo a extremo protege los datos sensibles antes de que salgan de tu servidor.
auth.ts
200 · firmado403 · Forbidden200 · firmado200 · firmado// 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
Cuerpo de la respuesta
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · firmado403 · Forbidden200 · firmado200 · firmado// 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
Cuerpo de la respuesta
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · firmado403 · Forbidden200 · firmado200 · firmado// 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
Cuerpo de la respuesta
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
Entrega una clave pública a los clientes
y mantén los secretos de firma en tu servidor.
Una app en la API Realtime de Bird API separa las credenciales de conexión de los clientes de la autoridad del backend. Los navegadores y las apps móviles abren WebSockets con una clave pública de la app que puedes incluir sin riesgo en los paquetes del cliente, mientras tu backend guarda el secreto con el que publica eventos y firma tokens de suscripción. Cuando tu política de seguridad exija rotar credenciales, puedes crear un segundo par de claves, desplegarlo en tus servicios y revocar el par anterior sin desconectar a los usuarios activos.
Protege conexiones, canales y datos en cada capa
Verifica quién puede abrir un socket, autoriza a qué canales se une, cifra los datos sensibles de los eventos y corta el acceso cuando termina una sesión.
- 01
Suscripciones a canales firmadas.
Cuando un cliente web o móvil se suscribe a un canal privado o de presencia, tu backend comprueba la sesión del usuario y firma un token HMAC-SHA256 vinculado a ese ID de conexión y a ese nombre de canal. Al vincular la firma al ID del socket, el token no puede reutilizarse en otra conexión, y las firmas de presencia fijan además la identidad del miembro que ve la sala.
- 02
Conexiones WebSocket autenticadas.
Como la clave pública de tu app está en el código del cliente, cualquier visitante podría intentar abrir un WebSocket inactivo. Si activas las conexiones autorizadas, cada socket nuevo debe autenticarse a través de tu backend en 30 segundos, iniciando sesión o suscribiéndose a un canal privado. Los sockets no verificados se cierran automáticamente y no cuentan para tu cuota de conexiones.
- 03
Datos cifrados de extremo a extremo.
Para actualizaciones reguladas o confidenciales, el SDK de servidor cifra localmente los datos de los eventos con una clave maestra de 32 bytes que permanece en tu infraestructura. Cada canal cifrado deriva su propia clave de descifrado, así que autorizar a un cliente para un flujo confidencial no le da acceso a otro, y los servidores intermedios solo ven texto cifrado en tránsito.
- 04
Revocación inmediata de sesiones.
Cuando un usuario cierra sesión, cambia su contraseña o pierde el acceso al espacio de trabajo, una sola llamada al servidor desconecta su identidad de miembro en todas las pestañas del navegador y dispositivos móviles abiertos. Los clientes tratan la desconexión como definitiva en lugar de reconectarse en bucle, y tu endpoint de autenticación puede rechazar nuevos inicios de sesión una vez revocada la sesión.
Canales cifrados
Cifra los datos sensibles antes de que salgan de tu servidor.
Configura una clave maestra de 32 bytes en el SDK de servidor para cifrar los eventos confidenciales dentro de tu propio proceso antes de publicarlos. Bird enruta el sobre cifrado a los suscriptores, y tu endpoint de autorización entrega la clave de descifrado derivada del canal a los clientes web autorizados. También puedes combinar el cifrado con la caché del último evento para que los clientes recién conectados reciban el estado más reciente como texto cifrado; usa nombres genéricos para canales y eventos, ya que los metadatos de enrutamiento no se cifran.
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" },
});
Aísla los flujos de cada cliente y valida el estado en tu servidor.
La autenticación de conexiones y la autorización de canales resuelven partes distintas del control de acceso. Exigir conexiones autorizadas bloquea los sockets anónimos, mientras que los canales privados y de presencia limitan qué usuario o cliente con sesión iniciada puede leer un flujo concreto. Mantén las actualizaciones de cada cliente en canales privados verificados por tu endpoint de autenticación, usa eventos entre clientes para señales efímeras de la interfaz, como los indicadores de escritura, y enruta las acciones que cambian el estado a través de tu backend.
Fija el tráfico a una región y aísla entornos por app.
Elige una región dedicada al crear una app de Realtime para mantener las conexiones WebSocket y los eventos publicados cerca de tus usuarios, aunque la región principal de tu espacio de trabajo esté en otro lugar. Como cada app funciona en su propio espacio de nombres aislado, con credenciales y cuotas independientes, crear apps separadas para desarrollo, staging y producción evita que las emisiones de prueba lleguen a los canales de clientes reales.
Guías de implementación para tu backend.
Consulta autorizar canales para conocer el formato de la solicitud del webhook y las utilidades de firma del SDK. Lee exigir conexiones autorizadas para aplicar el protocolo de conexión de 30 segundos, canales cifrados para configurar claves maestras y su rotación, y terminar conexiones de miembros para implementar el inicio de sesión de usuarios y la desconexión remota.
Sigue construyendo
con Realtime.
Combina la autorización de canales con presencia en directo, caché de estado y webhooks del backend usando las mismas credenciales de la app.
Canales
Enruta emisiones públicas, flujos privados, datos cifrados y estado en caché según el prefijo del canal.
→Presencia
Muestra quién está conectado en pestañas y dispositivos, detecta salidas y envía mensajes directamente a usuarios concretos.
→Webhooks
Activa flujos de trabajo en el backend cuando los canales se activan, los miembros salen o una caché necesita precargarse.
→Escala sin
perder el control.
Organiza equipos en espacios de trabajo, controla el acceso a la API y rastrea cambios en los registros de auditoría.
Organización
Harbor
El acceso permanece en su espacio de trabajo.
Producción/Claves de API
Backend del puerto
ActivoAlex Lee
Admin
Hoy · UTC
Registro de auditoría
Organización
Harbor
El acceso permanece en su espacio de trabajo.
Producción/Claves de API
Backend del puerto
ActivoAlex Lee
Admin
Hoy · UTC
Registro de auditoría
Organización
Harbor
El acceso permanece en su espacio de trabajo.
Producción/Claves de API
Backend del puerto
ActivoAlex Lee
Admin
Hoy · UTC
Registro de auditoría