no_picture

Devise で登録時にConfirmation Token が不正な値というエラー

Devise で確認メールで確認してから有効にする機能 Confirmable の機能をつかってたのだけど、トークンが不正というエラーがおきた。 この問題は devise 3.1.0 より前で、確認のために送信されるメールの内容をカスタマイズしていれば起きてるんじゃないかと思う。 DBに格納される Token の値が HMAC されるようになったらしい。 Use HMAC on tokens stored in the DB · 143794d · plataformatec/devise · GitHub そのため、画面をカスタマイズしている場合、token の取得方法が変えないといけないっぽい。 -<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p> +<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p> 確認メールだけでなく app/views/devise/mailer 内のファイル全部変えないといけない気がする。 confirmation_instructions.html.erb reset_password_instructions.html.erb unlock_instructions.html.erb あたりですね。 蛇足 v3.1.0 ってリリースされたの9月なんだが…さっき気づいたということは…。とおもって Gemfie.lock を git log –patch Gemfile.lock して devise 検索したら、デプロイされたのは最近だった。 参考 直してから探したやつだけど。

no_picture

Devise で email 変更する。

Railsの plugin で 認証を行なう devise という gem があります。 このユーザ認証で 実際にユーザにメールを送信して、登録を完了するという機能を提供するのに confirmable という機能があります。 このConfirmableという機能を使用していると管理者が ユーザのメールアドレスを変更してあげる必要がある場合、代えるときもメールがユーザに送信されます。これが便利なときもあったりテスト時にこまったりすることがあります。 devise :confirmable した モデルには skip_confirmation! skip_reconfirmation! というメソッドが追加されてるので、これらを呼び出すことで回避することができます。 ちなみに、これらのメソッドの中身をみると def skip_confirmation! self.confirmed_at = Time.now.utc end def skip_reconfirmation! @bypass_postpone = true end となってます。 confirmed_at に値がはいっていれば有効で、@bypass_postpone が true で メールの送信が回避できそうですね。このあたりの実装はversionによって変更される恐れがあるので直接利用するには注意が必要です。