使用Devise 3.2.3和Devise Confirmable运行Rails 4应用程序。
Devise为正确存储在数据库中的新创建的用户生成confirm_token,然后发送带有确认说明的邮件程序。出于安全原因,在邮件程序中发送的令牌与存储在数据库中的confirmation_token不同,但邮件中发送的令牌未解析为用户的正确确认令牌,因此用户永远不会被确认。
以下是我所说的一个例子:
数据库中的用户在创建后具有以下由Devise设置的confirmation_token attr:
beaa0ed7c9c2da72a99381ee705aa8ebd91672a5c18f5a44deeb43d0665080c4
以下链接通过电子邮件发送给用户:
http://localhost:3000/users/confirmation?confirmation_token=ZEagTsW1o1Ex_xGdQq7D
我已确认邮件程序的模板使用新的@token方法而不是旧的@ resource.confirmation_token
%p Welcome #{@email}!
%p You can confirm your account email through the link below:
%p= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token)
但是当我点击设计发出的链接时,@ token没有解析为用户正确的confirmation_token attr。从日志中:
Started GET "/users/confirmation?confirmation_token=ZEagTsW1o1Ex_xGdQq7D" for 127.0.0.1 at 2014-04-16 12:15:33 -0700
Processing by ConfirmationsController#show as HTML
Parameters: {"confirmation_token"=>"ZEagTsW1o1Ex_xGdQq7D"}
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`confirmation_token` = 'd876b3a89e02512b7c8ff632f2d8ff33dbe57ccc4df50469ad99e456c45938f8' ORDER BY `users`.`id` ASC LIMIT 1
正如你所看到的,在电子邮件中发出的@token已解决为d876b3a89e02512b7c8ff632f2d8ff33dbe57ccc4df50469ad99e456c45938f8而不是beaa0ed7c9c2da72a99381ee705aa8ebd91672a5c18f5a44deeb43d0665080c4。有什么想法吗?
答案 0 :(得分:2)
在对付了这个问题一段时间后,我回答了这个问题。我的用户模型上有一个after_create回调,它正在更新用户的属性,导致Devise在确认_instructions电子邮件发出后在内部重新生成confirmation_token,因此电子邮件中的令牌不再是最新的或有效的。