質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Q&A

0回答

499閲覧

Rails5 + Devise 4.4.0 でパスワードのリカバリー処理で reset_password_token invalidとなる。

shougo0819

総合スコア10

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

0グッド

0クリップ

投稿2018/01/23 02:38

編集2018/01/23 02:45

###前提・実現したいこと
Rails5.1.4, Devise (version 4.4.0)でユーザのログイン処理付きのwebアプリケーションを開発しています。

###発生している問題・エラーメッセージ
deviseでパスワードリセットメールを送信すると、メールは正常に送信され
対象ユーザのDBのreset_password_tokenカラムに例として以下のトークンが保存されますが、
38df6ba0e32d1e55e9d1ebc974aadb59ae1552858c800002efc3279ba949566d
送信されたメールのパラメータにも同一のトークン
38df6ba0e32d1e55e9d1ebc974aadb59ae1552858c800002efc3279ba949566d
がパラメータとして付与されますが、
パスワード再設定フォームで送信した際に、このトークンを更にencryptして検索をかけているため、
必然的にレコードが見つからず、必ず reset_password_token invalid のエラーが発生しています。

###該当のソースコード
関係がありそうな箇所を記載します。
その他必要情報ございましたら、共有しますので何卒よろしくお願いします。

ruby

1routes.rb 2... 3 devise_for :users, :controllers => { 4 :registrations => 'users/registrations', 5 :sessions => 'users/sessions', 6 :passwords => 'users/passwords', 7 } 8... 9 10app/controllers/users/passwords_controller.rb 11class Users::PasswordsController < Devise::PasswordsController 12 def new 13 super 14 end 15 def create 16 super 17 end 18 def edit 19 super 20 end 21 def update 22 super 23 end 24end 25 26app/model/user.rb 27class User < ApplicationRecord 28 devise :database_authenticatable, :registerable, 29 :recoverable, :rememberable, :trackable, :validatable, :omniauthable 30... 31end 32 33app/views/users/passwords/new.html.slim 34... 35 = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post, role: "form" }) do |f| 36 div class="form-group #{"has-error" if resource.errors.include?(:email)}" 37 = f.label :email 38 = f.email_field :email, autofocus: true, class: 'form-control' 39 - resource.errors.messages[:email].each do |msg| 40 span.help-block 41 = msg 42 = f.submit t('.send_me_reset_password_instructions', default: 'パスワード再設定メールを送信する'), class: 'btn btn-primary' 43... 44 45app/views/users/mailer/reset_password_instructions.html.slim 46p = t('.greeting', recipient: @resource.email, default: "Hello #{@resource.email}!") 47p = t('.instruction', default: 'Someone has requested a link to change your password, and you can do this through the link below.') 48p = link_to t('.action', default: 'Change my password'), edit_password_url(@resource, reset_password_token: @token, locale: I18n.locale) 49p = t('.instruction_2', default: "If you didn't request this, please ignore this email.") 50p = t('.instruction_3', default: "Your password won't change until you access the link above and create a new one.") 51 52 53

###試したこと
以下の様に独自処理を追加して現状動いています。
※ただし気持ち悪いので、標準のdeviseで動くように直したいと考えています。

ruby

1app/controllers/users/passwords_controller.rb 2class Users::PasswordsController < Devise::PasswordsController 3... 4 def create 5 #super <-これをコメントアウトして以下の処理を独自に追加 6 user = User.find_for_password_reset(params[:user][:email])#<-以下に記載※1 7 if user.persisted? 8 token, enc = Devise.token_generator.generate(User, :reset_password_token) 9 user.reset_password_token = enc 10 user.reset_password_sent_at = Time.now.utc 11 user.save 12 UserNotifierMailer.send_password_reset_email(user, token).deliver#<-以下に記載※2 13 return redirect_to new_user_session_path, success: "パスワードリセットメールを送信しました。ご確認下さい" 14 else 15 @user = user 16 render :action => :new 17 end 18... 19end 20 21#※1 22app/model/user.rb 23class User < ApplicationRecord 24... 25 def self.find_for_password_reset(email) 26 if (email.blank?) 27 record = new 28 record.errors.add(:email, "入力して下さい") 29 return record 30 end 31 record = self.where(email: email).first 32 if record.nil? 33 record = new 34 record.errors.add(:email, "入力いただいたメールアドレスでの登録はありません") 35 end 36 record 37 end 38... 39end 40 41#※2 42app/mailers/user_notifier_mailer.rb 43class UserNotifierMailer < ApplicationMailer 44 def send_password_reset_email(user,token) 45 @user = user 46 @token = token 47 mail( :to => @user.email, 48 :subject => 'パスワードを再設定して下さい' ) do |format| 49 format.text 50 end 51 end 52end 53 54app/views/user_notifier_mailer/send_password_reset_email.text.erb 55<%= @user.name %>様 56 57ログインパスワードの再設定のリクエストを承りました。 58 59以下のリンクからパスワード再設定をお願いします。 60 61<%= edit_password_url(@user, reset_password_token: @token, locale: I18n.locale) %> 62 63 64

###補足情報(言語/FW/ツール等のバージョンなど)
Rails 5.1.4
ruby 2.4.0p0
devise (4.4.0)

  • bcrypt (~> 3.0)
  • orm_adapter (~> 0.1)
  • railties (>= 4.1.0, < 5.2)
  • responders
  • warden (~> 1.2.3)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問