也许我很累并且缺少一些明显的东西,但是我看到了在Rails 4.1.16,Devise 3.5.10和Ruby 2.3.8上调试“重置密码令牌无效”的最奇怪的事情。
我知道并尝试了解决方法here和here。尝试在控制台中重设重置密码步骤,我想知道我的应用程序是否存在更基本的错误。
我可以运行u.send_reset_password_instructions
,它会愉快地创建reset_password_token
,将其提交给数据库,并在密码重置电子邮件中发送一个散列版本。
SQL (0.7ms) UPDATE "users" SET "reset_password_sent_at" = ?, "reset_password_token" = ?, "updated_at" = ? WHERE "users"."id" = 8 [["reset_password_sent_at", "2018-11-10 03:35:39.176325"], ["reset_password_token", "a8e9f1dd874735078fc79dbf1a72a5546edf12915eea604bc29e7da897de3c6e"], ["updated_at", "2018-11-10 03:35:39.176799"]]
因此,我们有一个a8e9f1dd874735078fc79dbf1a72a5546edf12915eea604bc29e7da897de3c6e
的reset_password_token,Devise已将其散列到NUY_d-cz4GsaCBJz-LPy
以便在电子邮件中使用。到目前为止一切都很好。
但是,如果我运行User.with_reset_password_token("NUY_d-cz4GsaCBJz-LPy")
,则可以正确解码散列,并且数据库什么也找不到...
User Load (3.3ms) SELECT "users".* FROM "users" WHERE "users"."reset_password_token" = 'a8e9f1dd874735078fc79dbf1a72a5546edf12915eea604bc29e7da897de3c6e' ORDER BY "users"."id" ASC LIMIT 1
=> nil
因此,我尝试在控制台中手动搜索完全相同的查询:User.find_by(reset_password_token: "a8e9f1dd874735078fc79dbf1a72a5546edf12915eea604bc29e7da897de3c6e")
我得到了……什么都没了
User Load (4.2ms) SELECT "users".* FROM "users" WHERE "users"."reset_password_token" = 'a8e9f1dd874735078fc79dbf1a72a5546edf12915eea604bc29e7da897de3c6e' LIMIT 1
=> nil
我确定这是“重置密码令牌无效”问题的根源,但是我无法弄清楚为什么数据库搜索在这种简单的事情上失败了。有明显的东西我应该检查吗?