2015-08-15 83 views
3

我發現了一個美妙的ActionCable gem,這是SPA的一個很好的解決方案。驗證ActionCable連接

我想只發送html,cssjs資產,所有其他連接將通過ActionCable執行。交換字符串或整數並不困難,但我如何通過ActionCable登錄?

+0

登錄必須使用通常的Rails的方式來完成,你可以查看這裏解釋的用戶是否經過驗證:https://github.com/rails/ actioncable –

+0

我知道我可以做到這一點,但我需要所有網站通過websockets工作。我可以執行此操作嗎? – asiniy

回答

-2

解決方案是使用HTTP授權令牌。這很簡單,廣泛而明顯。 This article幫了我很多

6

Readme

# app/channels/application_cable/connection.rb 
module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
    end 

    protected 
     def find_verified_user 
     if current_user = User.find(cookies.signed[:user_id]) 
      current_user 
     else 
      reject_unauthorized_connection 
     end 
     end 
    end 
end 

所以看起來你可以在這裏插入自己的find_verified_user邏輯。 reject_unauthorized_connection方法住在lib/action_cable/connection/authorization.rb作爲參考。

Heroku來自:

[驗證]可以以多種方式來完成,如將的WebSockets 穿過標準HTTP標頭通常用於身份驗證。 這意味着你可以使用相同的身份驗證機制 用於WebSocket連接的Web視圖。

由於您無法通過JavaScript自定義WebSocket標頭,因此012xx僅限於 瀏覽器發送的「隱式」授權(即Basic或cookie)。此外,處理 WebSockets的服務器與處理「普通」HTTP 請求的服務器完全分開是很常見的。這可能會導致共享授權頭文件變得困難,或者無法使用 。

考慮到這一點,將可能是一個真正的痛苦不只是使用普通的Web登錄流程設置您的身份驗證cookie,則認證步驟後提供您的SPA,但希望這可以給你一些三分球。

0

僅供參考,如果你devise已經安裝在你的應用程序,那麼你可以使用環境變量設置由warden找到authenticated user。對於每個經過身份驗證的用戶標識都將用戶對象存儲在環境var中。每個請求都通過warden中間件進行驗證。

注意:這個env是不同於ENV

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user_from_env 
    end 

    private 
    def find_verified_user_from_env 
     # extracting `user` from environment var 
     current_user = env['warden'].user 
     if current_user 
     current_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end 

如果你還沒有使用devise那麼,這裏是另一種解決方案。先決條件是,你將不得不在你的sessions_controller或類似的東西中設置一個名爲user_id的簽名cookie。 如

cookies.signed[:user_id] = current_user.id 

和連接:

# app/channels/application_cable/connection.rb 
module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user_from_cookies 
    end 

    private 
    def find_verified_user_from_cookies 
     current_user = User.find_by_id(cookies.signed[:user_id]) 
     if current_user 
     current_user 
     else 
     reject_unauthorized_connection 
     end 
    end 
    end 
end