Canales privados
Un canal cuyo nombre empieza con private- requiere autorización de tu backend además de la clave pública de la app. Tu backend aprueba al solicitante para ese canal y devuelve una firma calculada con el secreto de la app.
Usa canales privados para datos acotados, como las actualizaciones de pedidos de un cliente, el panel de un tenant o las notificaciones de una persona.
const bird = new BirdRealtime({
appKey: "your-app-key",
region: "us1",
authEndpoint: "/bird/auth",
});
const orders = bird.subscribe("private-orders-4821");
orders.bind("order-updated", (data) => {
console.log(data);
});let bird = BirdRealtime(options: .init(
appKey: "your-app-key",
region: "us1",
authEndpoint: URL(string: "https://your-backend.example.com/bird/auth")
))
let orders = bird.subscribe("private-orders-4821")
orders.bind("order-updated") { data in
print(data ?? "")
}val bird = BirdRealtime(
BirdRealtimeOptions(
appKey = "your-app-key",
region = "us1",
authEndpoint = "https://your-backend.example.com/bird/auth",
)
)
val orders = bird.subscribe("private-orders-4821")
orders.bind("order-updated") { data ->
println(data)
}Swift y Kotlin requieren una URL de autorización absoluta, mientras que un cliente de navegador puede usar una ruta del mismo origen. Añade el token de sesión de tu API mediante authHeaders. El cliente incluye estas cabeceras en cada solicitud de autorización, incluidas las solicitudes tras una reconexión.
El cliente envía el ID de conexión y el nombre de canal a authEndpoint. La suscripción se completa solo después de que el endpoint aprueba al solicitante y devuelve una firma válida. Autorización de canales define la solicitud, la respuesta y la cadena a firmar.
Nombrar canales por usuario o por tenant
Incluye el alcance del recurso en el nombre del canal y verifícalo en tu endpoint. Un cliente puede solicitar cualquier nombre de canal, así que tu backend debe impedir suscripciones entre clientes distintos:
if (channel_name !== `private-orders-${user.accountId}`) {
return res.sendStatus(403);
}if channel_name != f"private-orders-{user.account_id}":
return Response(status=403)if channelName != "private-orders-"+user.AccountID {
http.Error(w, "forbidden", http.StatusForbidden)
return
}if ($channelName !== "private-orders-{$user->accountId}") {
http_response_code(403);
return;
}Esta comparación es la decisión de autorización. Nunca confíes en nombres de canal difíciles de adivinar para controlar el acceso.
Qué admiten los canales privados
- Eventos de cliente. Cuando la app tiene habilitados los eventos de cliente, un cliente suscrito puede enviar eventos client- a los demás clientes del canal sin pasar por tu servidor. El edge los rechaza en canales públicos.
- Conteo de conexiones. Con las opciones de conteo de conexiones y eventos de conteo de conexiones habilitadas en la app, el cliente recibe bird:connection_count para el canal.
- Publicación desde el servidor. Publicar desde tu servidor funciona exactamente igual que en un canal público: indica el canal en el array channels. La autorización no aplica a tu servidor, que ya posee el secreto de la app.
Los canales privados no tienen identidad de miembros ni eventos de miembros. Si necesitas saber quién está presente, usa un canal de presencia.
Cuando se rechaza una suscripción
Una suscripción rechazada llega como bird:subscription_error. Las causas habituales incluyen una respuesta que no es 2xx de tu endpoint o una firma que no coincide con la solicitud. Consulta Autorización de canales para solucionar problemas.
Próximos pasos
- Autorización de canales es el contrato que implementa tu backend.
- Canales de presencia añaden identidad de miembros sobre la misma autorización.
- Excluir destinatarios de eventos evita que un cliente reciba el evento que él mismo provocó.
Recursos relacionados
Continúa con la documentación, guías y ejemplos de este tema.