我已经在我的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收到的电子邮件中,它只包含一次。