Rails + Devise"重置密码令牌无效"但令牌与db令牌匹配......?

时间:2016-03-24 04:18:43

标签: ruby-on-rails devise

尝试重置密码,我的(自定义)邮件程序有这一行:

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

1 个答案:

答案 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