Rails + Devise:密码重置时“重置密码令牌无效”消息

时间:2016-05-29 10:16:46

标签: ruby-on-rails ruby devise token bcrypt

我已经在我的rails网站的生产版本上遇到了这个奇怪的错误了一段时间了。这不会发生在本地,这使我的调试工作受挫。

我遵循了以下SO问题中提出的建议:

Upgrading to devise 3.1 => getting Reset password token is invalid Rails 4 + Devise: Password Reset is always giving a "Token is invalid" error on the production server, but works fine locally.

具体来说,将我的reset_password_instructions.html.erb文件更改为:

<p>Hello <%= @resource.email %>!</p>

<p>Someone has requested a link to change your password. You can do this through the link below.</p>

<p><%= link_to 'Change my password', edit_user_password_url(@resource, :reset_password_token => @token) %></p>

<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>

我正在使用以下宝石:

devise (3.5.9)
      bcrypt (~> 3.0)
      orm_adapter (~> 0.1)
      railties (>= 3.2.6, < 5)
      responders
      thread_safe (~> 0.1)
      warden (~> 1.2.3)

当我在生产站点上创建测试用户,然后单击“忘记了我的密码”时,它会在服务器上生成一个重置令牌(我可以通过Rails控制台将其看作XYZ123)。

如果我通过Rails控制台创建一个令牌生成器(Devise :: TokenGenerator.new)和我们的密钥,根据Devise源,我能够将通过电子邮件发送给用户的链接(raw)中的令牌转换为存储在数据库中的重置令牌。这些完全匹配,如果我在生产中使用rails控制台中的“User.find_or_initialize_with_error_by”,它就能够正确地找到与令牌相关联的用户。当然,我是按照设计源代码手动完成的,所以也许我正在做一些代码不是。

有没有人有任何关于为什么会发生这种情况的理论?此外,我的网站为密码重置电子邮件生成的URL如下:

http://www.WEBSITE.com/users/password/edit.<USER_ID>?reset_password_token=<CORRECT_RAW_RESET_PASSWORD_TOKEN>?reset_password_token=<CORRECT_RAW_RESET_PASSWORD_TOKEN>

不确定为什么reset_password_token参数包含两次 - 在我通过Gmail收到的电子邮件中,它只包含一次。

0 个答案:

没有答案