Rails, devise:如何通过令牌认证替换先前的登录方式?

4

我使用带有TokenAuthentication模块的Devise。

当我未经身份验证并遵循带有?auth_token=部分的链接时,它是可以的。像这样:

我遵循链接:/orders?auth_token=q2a8w6virARzv6B2C1vR 其中q2a8w6virARzv6B2C1vRuser1的authentication_token。现在我作为user1登录了。

但是当我通过电子邮件/密码和常见的登录页面以某个用户的身份登录,然后跟随具有另一个用户令牌的auth_token的链接时,我意外地保持为第一个用户登录状态。

就像这样:

  1. 我通过登录页面登录。我填写user2的电子邮件和密码。现在我作为user2登录了。
  2. 我遵循链接:/orders?auth_token=q2a8w6virARzv6B2C1vR 其中q2a8w6virARzv6B2C1vRuser1的authentication_token。但我仍然作为user2登录,而不是期望的user1

这是一个bug吗?如何更改此行为以强制替换通过令牌进行的身份验证?

Rails 3.0.6

Devise 1.2.1

2个回答

2

你在用户模型中取消注释了:token_authenticatable,对吗?


是的,我当然在用户模型中取消了:token_authenticatable的注释。 - petRUShka

2

让我们来进行一些问题的复活...

在运行策略(token_authenticatable、database_authenticatable)之前,Warden首先检查当前会话中是否已设置用户。

这发生在:https://github.com/hassox/warden/blob/3d653371a2ff594d9965c1dde642c98cd8485e15/lib/warden/proxy.rb#L212

动作响应/orders查询是否只使用了令牌认证?如果是这样的话,您可以添加:before_filter: reset_session(在authorize_user之前),这样Warden就无法从会话中反序列化用户并被迫执行身份验证。

[编辑] 这个问题票据包含了合理的解决方案:https://github.com/plataformatec/devise/issues/1644


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接