2014-04-16 33 views
2

運行Devise 3.2.3和設計確認的Rails 4應用程序。設計@token不能正確解析(設計3.2.3)

Devise爲正確存儲在數據庫中的新創建的用戶生成一個confirmation_token,然後發送一封包含確認指令的郵件程序。由於安全原因,郵件發送出的令牌與存儲在數據庫中的confirmation_token不同,但發送給郵件的令牌不會解析爲用戶的正確確認令牌,因此用戶永遠不會被確認。

下面是我所談論的例子:

在數據庫中的用戶具有以下confirmation_token ATTR通過制定創建後設置:

beaa0ed7c9c2da72a99381ee705aa8ebd91672a5c18f5a44deeb43d0665080c4 

和下面的鏈接發送出去在電子郵件用戶:

http://localhost:3000/users/confirmation?confirmation_token=ZEagTsW1o1Ex_xGdQq7D 

我已經證實了郵件模板使用新@token方法,而不是舊@ resource.confi rmation_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 "https://stackoverflow.com/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電子郵件發送出去。有任何想法嗎?

回答

2

回答這個問題後,我的頭反了這一段時間。我在我的用戶模型上進行了一次after_create回調,它正在更新用戶的屬性,導致Devise在發送confirmation_instructions電子郵件後在內部重新生成confirmation_token,因此電子郵件中的令牌不再是當前或有效的。