我在部署到扭矩箱的导轨应用上有一个红宝石。我需要一些方法来保护我的应用程序中的websockets。我正在使用stomp websockets,有没有办法在用户进行websocket连接时对用户进行身份验证?我可以使用用户名和密码参数,但它们目前被忽略。有没有其他方法来验证此连接?谢谢!
答案 0 :(得分:1)
您可以使用会话和存储的令牌向Stomplet验证消息。为此,您必须设置Rails才能使用Torquebox会话存储。这可以使用初始化程序完成,例如config/initializers/torquebox_init.rb
:
AppName::Application.config.session_store :torquebox_store
现在,Stomplet可以访问会话。下面是一个示例Stomplet,它使用会话参数:authentication_token
来匹配数据库中用户的authentication_token。检查身份验证令牌是否订阅,发送消息和取消订阅:
require 'torquebox-stomp'
class StompletDemo
def initialize()
super
@subscribers = []
end
def configure(stomplet_config)
end
def on_message(stomp_message, session)
token = session[:authentication_token]
if is_authenticated?( token )
@subscribers.each do |subscriber|
subscriber.send( stomp_message )
end
end
end
def on_subscribe(subscriber)
session = subscriber.session
if is_authenticated?(session[:authentication_token])
@subscribers << subscriber
end
end
def on_unsubscribe(subscriber)
session = subscriber.session
if is_authenticated?(session[:authentication_token])
@subscribers.delete( subscriber )
end
end
def is_authenticated?(token)
User.where( authentication_token: token ).exists?
end
end
现在您要做的就是确保在用户进行身份验证时设置session[:authentication_token]
。大多数情况下,这将在控制器中设置:
# user has successfully authenticates
session[:authentication_token] = @user.authentication_token
答案 1 :(得分:1)
对于遇到此问题的其他人,我就是这样解决的。
https://gist.github.com/j-mcnally/6207839
基本上,令牌系统并没有为我扩展,特别是因为我使用了设计。 如果你想在chrome扩展中托管你的websocket,那么直接将用户名/密码直接传递给stomp并让它在stomplet中管理自己的虚拟订阅者会话就更容易了。这也允许你做一些有趣的事情,就像你推动的那样。