我正在使用Rails教程3来滚动我自己的身份验证系统,直到我尝试密码重置部分它才有效。当我提交密码重置表单时,会创建一个令牌并将其作为reset_password_token
存储在数据库中。然后发送一封电子邮件,其中包含密码重置表单的链接,如下所示:
<a href="http://localhost:3000/password_resets/$2a$10$UU.bHK5V4o6BFRFPqjtPoOV12aSwq9nvy7OQuxFp.rFjK6lqfJali/edit?email=myemail">Reset password</a>
当我点击链接(或复制/粘贴它,因为它是本地的)时,我收到错误:
No route matches [GET] "/password_resets/$2a$10$XAh7yOyphGR84n5fSBUZhuM4WpuyVwLayIZgB0QTTF.q3PgKX9Kz6/edit"
但是rake路线显示路线确实存在:
edit_password_reset_path GET /password_resets/:id/edit(.:format) password_resets#edit
我的代码和教程中的代码之间的唯一区别是我的令牌似乎更长。它大约有60个字符,而Hartl大约是22个。另外,当我在控制台中键入SecureRandom.urlsafe_base64
时,我得到一个22个字符的标记。我不确定为什么它会创造一个更长的一个,但我也不确定它是否重要。
更新
邮件模板:
To reset your password click the link below:
<%= edit_password_reset_url(@user.reset_password_token, email: @user.email) %>
This link will expire in two hours.
If you did not request your password to be reset, please ignore this email and
your password will stay as it is.
答案 0 :(得分:0)
问题是,我怀疑这个令牌。我之前使用过devise进行身份验证,并且由于表命名不一致,邮件程序没有返回令牌而是令牌摘要。一旦邮件程序返回令牌,路由就可以正常工作。