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

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

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

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

Ruby on Rails

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

Q&A

0回答

979閲覧

devise のログインフォーム からのログインに失敗した場合の遷移先

mixberryparfait

総合スコア21

Devise

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/12/07 08:27

前提

devise ジェムで認証を行っている Rails システムがあります

発生している問題・エラーメッセージ

改修作業のために数ヶ月ぶりに docker 上開発環境で起動して
ホスト上の Chrome から devise が生成するログインフォームにアクセスして
わざと間違ったログイン情報でログインしようとしたところ
SessionController#new (ログインフォーム ) にリダイレクトされるんですが
なぜか CSRF トークン認証に失敗して 500 エラーになります
(もう1度ログイン画面に戻ってほしい)

CSRF の判定を行っているジェムの
actionpack (5.2.4.4) lib/action_controller/metal/request_forgery_protection.rb
中のソースにデバッグ入れてみたところ #new にリダイレクトされているにもかかわらず
request.get? = false になっているのでなぜか POST で呼ばれている???ようなのです

とりあえずログインに失敗した場合にどこのコントローラをとおっているのかを特定したいです

ログイン成功時のパスは
def after_sign_in_path_for(resource)
で設定できるようですが、失敗した場合の遷移先はどこで決められているのでしょうか
またカスタマイズ方法はありますか?

以下ログインフォームからサブミットしたときのログになります
(トークンを公開することのリスクがわかってないので念のため伏字におきかえてあります)

I, [2020-12-07T01:46:09.359958 #41] INFO -- : Started POST "/users/sign_in" for 172.20.1.1 at 2020-12-07 01:46:09 +0000 I, [2020-12-07T01:46:09.378305 #41] INFO -- : Cannot render console from 172.20.1.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 D, [2020-12-07T01:46:09.510214 #41] DEBUG -- : (0.3ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 D, [2020-12-07T01:46:09.556357 #41] DEBUG -- : (0.4ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC I, [2020-12-07T01:46:09.802842 #41] INFO -- : Processing by Users::SessionsController#create as HTML I, [2020-12-07T01:46:09.804215 #41] INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxx", "user"=>{"email"=>"test@test.com", "password"=>"[FILTERED]", "remember_me"=>"0"}} "request.get? = false" "protect_against_forgery? = true" "any_authenticity_token_valid? = true" sessions_controller.rb:23:in `create' session create D, [2020-12-07T01:46:09.882327 #41] DEBUG -- : User Load (0.9ms) SELECT `users`.* FROM `users` WHERE `users`.`email` = 'test@test.com' ORDER BY `users`.`id` ASC LIMIT 1 I, [2020-12-07T01:46:09.883894 #41] INFO -- : Completed 401 Unauthorized in 79ms (ActiveRecord: 3.2ms) I, [2020-12-07T01:46:11.172970 #41] INFO -- : Processing by Users::SessionsController#new as HTML I, [2020-12-07T01:46:11.174074 #41] INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxx", "user"=>{"email"=>"test@test.com", "password"=>"[FILTERED]", "remember_me"=>"0"}} "request.get? = false" "protect_against_forgery? = true" "any_authenticity_token_valid? = false" W, [2020-12-07T01:46:11.190184 #41] WARN -- : Can't verify CSRF token authenticity. I, [2020-12-07T01:46:11.191494 #41] INFO -- : Completed 422 Unprocessable Entity in 14ms (ActiveRecord: 0.0ms)

該当のソースコード

devise 関連の設定がほとんど自動生成されたものから変更してないはずですが
devise 関連のコードは config や app 以下にちらばっているので
必要なものがあれば提示します

試したこと

class Users::SessionsController < Devise::SessionsController # before_action :configure_sign_in_params, only: [:create] before_action :reset_session_before_login, only: :create # GET /resource/sign_in def new puts 'session new' puts "request.get? = #{request.get?}" super end # POST /resource/sign_in def create puts 'session create' super puts 'login success' end # DELETE /resource/sign_out # def destroy # super # end protected # If you have extra params to permit, append them to the sanitizer. # def configure_sign_in_params # devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute]) # end def reset_session_before_login user_return_to = session[:user_return_to] reset_session session[:user_return_to] = user_return_to if user_return_to end end

ログを見る限りリダイレクト時に
Processing by Users::SessionsController#new as HTML
となっているので
上記の様なデバッグを挿入してみました

最初にログイン画面を表示したときにはデバッグが表示されますが
ログインサブミットした後のリダイレクトの際には表示されませんでした

コントローラを通っていないのに
Processing by Users::SessionsController#new as HTML
を何が表示しているのか謎です


ちなみに最初にログイン画面は表示できているので当然ですが routes は #new は GET になっています

# rails routes Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) users/sessions#new user_session POST /users/sign_in(.:format) users/sessions#create destroy_user_session DELETE /users/sign_out(.:format) users/sessions#destroy

補足情報(FW/ツールのバージョンなど)

ホスト:
MAC OSX
docker desktop 2.0.1.5

ゲスト:
ruby:2.5.1 コンテナイメージ
bundler 1.16.2
rails-5.2.0

よろしくお願いいたします

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問