2

Devise 3.2.3 と Devise Confirmable で Rails 4 アプリを実行する。

Devise は、データベースに正しく保存されている、新しく作成されたユーザーの Confirmation_token を生成し、確認手順を記載したメーラーを送信します。メーラーで送信されたトークンは、セキュリティ上の理由からデータベースに保存されている confirm_token とは異なりますが、メーラーで送信されたトークンはユーザーの正しい確認トークンに解決されないため、ユーザーは確認されません。

これが私が話していることの例です:

データベース内のユーザーには、作成後にDeviseによって設定された次のconfirmation_token属性があります:

beaa0ed7c9c2da72a99381ee705aa8ebd91672a5c18f5a44deeb43d0665080c4

次のリンクが電子メールでユーザーに送信されます。

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

メーラーのテンプレートが古い @resource.confirmation_token の代わりに新しい @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 属性に解決されません。ログから:

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 は beaa0ed7c9c2da72a99381ee705aa8ebd91672a5c18f5a44deeb508d06. 何か案は?

4

1 に答える 1

2

しばらくこれに頭を悩ませた後、この質問に答えました。ユーザーの属性を更新しているユーザー モデルに after_create コールバックがあり、confirmation_instructions メールが送信された後に Devise が内部で Confirmation_token を再生成していたため、メール内のトークンが最新または有効ではなくなりました。

于 2014-04-17T00:04:21.370 に答える