我刚刚通过hello world为Pusherapp。现在我想创建私有频道,以便用户只阅读他们应该阅读的消息。
Pusher的文档只提供了一些如何做到这一点的细节,我有点迷失。
来自docs:
... 返回Pusher JS库 连接时的socket_id 推动器。
当它试图订阅时 私有频道,它发回一个AJAX 请求您的服务器 channel_name和socket_id为 参数。
此默认网址为 http://yourserver.com/pusher/auth。 ...
class PusherController < ApplicationController
def auth
if current_user
response = Pusher[params[:channel_name]].authenticate(params[:socket_id])
render :json => response
else
render :text => "Not authorized", :status => '403'
end
end
end
给定唯一的用户ID(current_user.id),如何验证该用户然后让他/她订阅相应的频道?
由于
答案 0 :(得分:10)
这篇关于实施的博客文章似乎更多地解释了一些事情:https://pusher.com/docs/client_api_guide/client_private_channels
授权方案基于 这个想法,而不是 实现自定义用户 身份验证,并增加复杂性 我们应该相信,并说明推动者 现有的身份验证级别 由您的申请提供。我们也 想确保有人在读书 从您的应用程序发送到的数据 浏览器无法连接 作为该用户的频道,和 因此不能包含任何秘密 在页面HTML。
听起来您的应用程序的业务逻辑应该对用户进行身份验证并确定他们应该访问私有渠道。
他们的图表显示:
经过身份验证后,应用程序会请求订阅该用户。 Pusher用socket_id回复。然后他们使用它连接。
以下是他们描述的方式:
如此图所示,一个独特的 生成套接字ID并将其发送给 Pusher的浏览器。这是发送给 你的应用程序(1)通过AJAX 授权用户的请求 访问您的频道 现有的认证系统。如果 成功申请退货 授权字符串到浏览器 与你签署了Pusher的秘密。这是 通过WebSocket发送给Pusher, 完成授权(2) 如果授权字符串匹配。
博客文章底部的示例进一步阐明:
假设您有一个名为project-3的频道,用户A和B可以访问该频道,但不能访问C.您希望将此频道设为私有,以便用户C无法收听私人事件。只需将事件发送到private-project-3并在浏览器中订阅即可。只要您使用最新的JavaScript(版本1.3或更高版本),您就会看到对您的应用程序发出POST请求/ pusher / auth。这将失败,因此订阅请求将不会发送到套接字。
所以,对我来说这听起来像: 1)订阅请求发送给Pusher 2)Pusher POST到您的/ auth方法以确定用户是否可以访问该频道 3)如果您的业务逻辑允许用户访问此通道,则auth方法返回“ok”响应:
auth = Pusher[params[:channel_name]].socket_auth(params[:socket_id])
content_type 'application/json'
return JSON.generate({
:auth => auth
})
我没有使用过Pusher本身,但它的模型似乎反映了其他基于推送的模型的结构。希望这有帮助!