这是我的情景。
首先,我以Alice身份登录: http://localhost:3000/?auth_token=eMXBk8cuJMA1ETZfMIgB 然后,在没有注销的情况下,我以Bob身份登录: http://localhost:3000?auth_token=Z9Ui7Cw_xCnOmGWOEUEH
在第二次GET请求之后,我仍然以Alice身份登录,而不是Bob。 如果我在两个auth_token登录之间执行http://localhost:3000/users/sign_out,一切都没问题。 没有sign_out,Bob无法使用他的令牌登录。
这是一个错误,还是应该由于一些我不知道的安全问题? 可以通过钩子覆盖这种行为吗?
答案 0 :(得分:2)
我已经通过restful_authentication和设计遇到了这个问题。这是我用它来处理它(放在application_controller.rb中)并在需要的地方调用它。请注意,我使用:ak作为身份验证令牌。改变你正在使用的任何东西。
def switch_session(api_key_passed)
if api_key_passed != current_user.authentication_token
logger.info("******Switching session as token is different.*******")
user = User.find_by_authentication_token(api_key_passed)
sign_out(user)
if @api_login_enabled.present?
redirect_to(new_user_session_path(:ak => api_key_passed))
else
logger.info("***API Login Setting is Disabled.***")
end
end
end
答案 1 :(得分:1)
Devise的token_authenticatable策略是一个登录路径。将用户的authentication_token
发送给Devise将登录该用户并设置会话,就像通过Web登录一样。它不应该充当API密钥,它必须在每次请求时发送,并且一旦服务器响应,该请求的知识就会消失。
请点击此处查看此问题以获取更多信息:https://github.com/plataformatec/devise/issues/300
如果您希望将它更像API密钥,那么@ jschorr的答案将会起作用,但是您应该知道原始问题实际上不会持续不同客户端之前用户的会话,这不是会话泄漏的安全问题客户之间,这正是Devise的作者所期望的。正如您需要注销您的重要其他人的网络邮件帐户以检查您自己是否只是从同一台计算机上检查过他们的邮件一样,您需要先向您的Rails应用程序发送注销消息,然后才能切换帐户。 / p>答案 2 :(得分:1)
您缺少devise.rb初始化程序的设置:
# By default Devise will store the user in session. You can skip storage for
# :http_auth and :token_auth by adding those symbols to the array below.
# Notice that if you are skipping storage for all authentication paths, you
# may want to disable generating routes to Devise's sessions controller by
# passing :skip => :sessions to `devise_for` in your config/routes.rb
config.skip_session_storage = [:token_auth]
因此,当用户使用auth_token进行身份验证时,不会使用任何会话。