2011-02-23 66 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 
    }) 

我沒有使用推杆本身,但其模式似乎反映其他基於推的模型的結構。希望這可以幫助!