尝试重置密码,我的(自定义)邮件程序有这一行:
edit_user_password_url(@user, reset_password_token: @user.reset_password_token)
这会创建一个这样的链接:
http://fixit-rails.dev//users/password/edit.6?reset_password_token=13f76244d39b0dfb9746674058a45559280358b99c1fdc36c6b9af2de2ba6376
在数据库中,用户具有以下reset_password_token
:
13f76244d39b0dfb9746674058a45559280358b99c1fdc36c6b9af2de2ba6376
用户可以成功转到新密码屏幕,但是当他点击提交时,会显示一条错误消息"Reset password token is invalid"
为什么设计不识别令牌?
更新
我使用以下代码创建令牌:
def generate_reset_password_token
raw, enc = Devise.token_generator.generate(User, :reset_password_token)
self.reset_password_token = enc
self.reset_password_sent_at = Time.now.utc
self.save(validate: false)
end
答案 0 :(得分:0)
我找到了解决方案!
edit_user_password_url(@user, reset_password_token: @user.reset_password_token)
应改为:
edit_user_password_url(@user, reset_password_token: @token)
您可能会问@token
是什么?它是raw
来自:
def generate_reset_password_token
raw, enc = Devise.token_generator.generate(User, :reset_password_token)
self.reset_password_token = enc
self.reset_password_sent_at = Time.now.utc
self.save(validate: false)
end
在设计中,它会自动设置,但如果您正在做自己的事情,则需要保存raw
并将@token
设置为邮件中的raw
。