私有频道
名称以 private- 开头的频道除了公开的应用密钥外,还需要来自你的后端的授权。你的后端批准该频道的调用方,并返回使用应用密钥计算的签名。
私有频道适用于有权限范围的数据,例如客户的订单更新、租户的仪表板或个人的通知。
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 和 Kotlin 需要绝对授权 URL,而浏览器客户端可以使用同源路径。通过 authHeaders 添加 API 的会话令牌。客户端在每次授权请求中都会包含这些请求头,包括重连后的请求。
客户端将连接 ID 和频道名称发送到 authEndpoint。只有在端点批准调用方并返回有效签名后,订阅才会完成。授权频道定义了请求、响应和待签名字符串。
按用户或按租户命名频道
将资源范围放入频道名称中,并在端点中进行验证。客户端可以请求任意频道名称,因此你的后端必须防止跨客户订阅:
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;
}这个比较就是授权决策。切勿依赖不可猜测的频道名称来实现访问控制。
私有频道支持的功能
- 客户端事件。 当应用启用了客户端事件后,已订阅的客户端可以向频道上的其他客户端发送 client- 事件,无需经过你的服务器中转。边缘节点会在公开频道上拒绝这些事件。
- 连接计数。 当应用的连接计数和连接计数事件设置启用后,客户端会收到该频道的 bird:connection_count。
- 服务器发布。 从服务器发布的方式与公开频道完全相同:在 channels 数组中指定频道名称。授权不适用于你的服务器,因为它已经持有应用密钥。
私有频道没有成员身份信息,也没有成员事件。如果你需要了解谁在线,请使用在线状态频道。
订阅被拒绝时
被拒绝的订阅会以 bird:subscription_error 形式到达。常见原因包括端点返回非 2xx 响应,或签名与请求不匹配。参阅授权频道了解故障排查方法。
后续步骤
相关资源
继续查阅此主题的文档、指南和示例。资源为英文。