2011-02-23 59 views
4

我刚刚通过了Pusherapp的hello world。现在我想创建私人频道,以便用户只能阅读他们应该阅读的信息。带Pusherapp的私人频道(使用Rails)

Pusher文档只提供一些关于如何做到这一点的细节,而且我有点迷茫。

docs

... 推动JS库返回 一个socket_id当它连接到 推杆。

当它试图订阅 专用通道,它发回一个AJAX请求 与 CHANNEL_NAME您的服务器和socket_id为 参数。

默认的URL是 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),我如何可以验证该用户,然后让他/她订阅了相应的通道?

感谢

回答

10

这对实现的博客文章似乎可以解释的东西多一点:https://pusher.com/docs/client_api_guide/client_private_channels

的授权方案是基于 ,与其 实现自定义用户 验证这个想法,并增加复杂性 和状态推送,我们应该信任 现有的身份验证 由您的应用程序提供。我们也 希望确保有人读您的应用程序发送到浏览器 数据 将无法​​ 连接到一个通道作为该用户,并 因此不能包含任何机密HTML网页 。

听起来像您的应用程序的业务逻辑应验证用户,并决定他们应该访问私人频道。

他们图显示:

enter image description here

一旦通过验证,应用程序请求订阅用户。推送者用socket_id回复。然后他们使用它连接。

这里是他们是如何描述它:

如该图所示,生成一个唯一的 插座ID,并通过推送至 浏览器。这通过AJAX 请求发送至您的应用(1) ,该请求授权用户通过 访问现有认证系统的频道。如果 成功,您的申请将返回一个 授权字符串到您与Pusher密码签署的浏览器 。这是 通过WebSocket发送给Pusher, 如果授权字符串匹配,则完成授权(2) 。

在博客中做了进一步明确的底部,例如:

假设你有一个名为项目3通道,其中用户A和B可以访问,但不是C.你想将此频道设为专用,以便用户C无法收听私人活动。只需将事件发送到private-project-3并在浏览器中订阅即可。只要您使用的是最新版本的JavaScript(版本1.3或更高版本),就会看到您的应用程序向/ pusher/auth发出了POST请求。这将会失败,因此订阅请求将不会被发送到套接字。

所以,对我来说这听起来像: 1)请订阅发送到推 2)推帖子送到你的/ AUTH方法来确定用户是否可以访问通道 3)如果你的业务逻辑允许用户访问此通道中,auth方法返回“OK”响应:

auth = Pusher[params[:channel_name]].socket_auth(params[:socket_id]) 

    content_type 'application/json' 
    return JSON.generate({ 
     :auth => auth 
    }) 

我没有使用推杆本身,但其模式似乎反映其他基于推的模型的结构。希望这可以帮助!