我發現了一個美妙的ActionCable gem,這是SPA的一個很好的解決方案。驗證ActionCable連接
我想只發送html
,css
和js
資產,所有其他連接將通過ActionCable
執行。交換字符串或整數並不困難,但我如何通過ActionCable登錄?
我發現了一個美妙的ActionCable gem,這是SPA的一個很好的解決方案。驗證ActionCable連接
我想只發送html
,css
和js
資產,所有其他連接將通過ActionCable
執行。交換字符串或整數並不困難,但我如何通過ActionCable登錄?
解決方案是使用HTTP授權令牌。這很簡單,廣泛而明顯。 This article幫了我很多
# 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,但希望這可以給你一些三分球。
僅供參考,如果你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
登錄必須使用通常的Rails的方式來完成,你可以查看這裏解釋的用戶是否經過驗證:https://github.com/rails/ actioncable –
我知道我可以做到這一點,但我需要所有網站通過websockets工作。我可以執行此操作嗎? – asiniy