我找到了一个很好的ActionCable gem,这是一个很好的解决方案。
我只想发送html、css和js资产,所有其他连接都将通过ActionCable实现。交换字符串或整数并不困难,但是如何通过ActionCable登录呢?
发布于 2015-09-02 16:44:05
解决方案是使用HTTP授权令牌。这很简单,很普遍,很明显。这篇文章帮了我很多忙
发布于 2015-08-25 14:47:20
来自自述
# 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中以供参考。
来自赫鲁库
身份验证可以通过多种方式进行,因为WebSockets将通过通常用于身份验证的标准headers。这意味着您也可以使用与WebSocket连接上的web视图相同的身份验证机制。 由于不能从WebSocket中自定义JavaScript头,所以只能使用从浏览器发送的“隐式”auth (即Basic或cookies)。此外,处理WebSockets的服务器通常与处理“正常”HTTP请求的服务器完全分离。这会使共享授权标头变得困难或不可能。
考虑到这一点,不只是使用正常的web登录流来设置auth cookie,在身份验证步骤之后交付SPA,这可能是一个真正的痛苦,但希望这可以给您一些提示。
发布于 2017-05-15 02:39:55
FYI,如果您已经在应用程序中安装了devise,那么可以使用warden设置的环境变量来查找authenticated user。对于每个经过身份验证的用户,典狱长都将用户对象存储在环境var中。每个请求都由warden中间件进行身份验证。
Note:这个环境与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,下面是另一个解决方案。前提是,您必须在您的user_id中设置一个名为sessions_controller之类的签名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
endhttps://stackoverflow.com/questions/32025897
复制相似问题