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

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

ただいまの
回答率

88.78%

Deviseで正しいメールアドレスとパスワードを入れてもログインできずにリダイレクトで無限ループしてしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,531

joru

score 40

前提・実現したいこと

railsサービスでdeviseを用いて、ユーザの登録画面を作り、その上でこの記事を参考にして、最初はメールアドレスだけを入れ、メール認証のあとパスワードを設定する流れにしました。

すると、rails dbconsoleで確認しても登録されているメールアドレスとパスワードの組み合わせでもログインできなくなってしまいました。

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

Started POST "/users/sign_in" for ::1 at 2019-04-28 20:52:37 +0900
Processing by Devise::SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"0uhzmTtZPorE4kBCoJhyMxgbl3Mn0UKgIE5fCwooTSvc6fIpIvITKcn4ft15NZMmAnOa3oxMF1aDS7a5OWK2fQ==", "user"=>{"email"=>"kohei.discard@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
Can't verify CSRF token authenticity.
  User Load (1.8ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT ?  [["email", "kohei.discard@gmail.com"], ["LIMIT", 1]]
  ↳ vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Redirected to http://localhost:3000/
Completed 302 Found in 204ms (ActiveRecord: 1.8ms)


Started GET "/" for ::1 at 2019-04-28 20:52:37 +0900
Processing by CouponsController#index as HTML
Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms)

該当のソースコード

基本的にソースコードはこの記事通りです。

関連ファイルが多く、どれこのエラーに作用しているのかわからないので、自分が怪しいと思うルートファイルを載せておきます。

  routes.rb

  devise_for :users, controllers: {
    registrations: "users/registrations",
    confirmations: "users/confirmations"
  }
  devise_scope :user do
    patch "users/confirmation", to: "users/confirmations#confirm"
  end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

ブラウザのCookieをクリアしたらどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/11 11:57

    ブラウザをfirefoxを用いるといまだにうまくいかないのですが、chromeだとcookieを消したことでうまくいきました。

    ありがとうございます

    キャンセル

0

Can't verify CSRF token authenticity

が原因ではないですか?

sessionで保持しているものと、この度、authenticity_tokenをキーとして送られたコード0uhzmTtZPorE4kBCoJhyMxgbl3Mn0UKgIE5fCwooTSvc6fIpIvITKcn4ft15NZMmAnOa3oxMF1aDS7a5OWK2fQ が異なるので、弾いているのだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/01 12:55

    > セッションの保持しているauthenticity_tokenはどのようにして確認すれば良いのでしょうか?
    session変数の中に格納されていると思います。`session[: _csrf_token]`で確認できます。確か、リクエストからレスポンスまでの流れの中で、早い段階で確認するので、controller中でbinding.pryなんかで止めて見ようと思っても、跳ね返されちゃうかもしれません。getリクエストならverify tokenしなかったようなソースコードを見たことがあるので、getでアクセスして見てみてください。

    > protect_from_forgery with: :null_sessionをapplication.rbに記述している
    application_controllerではないですか?

    キャンセル

  • 2019/05/01 21:21 編集

    session_controller.rbのnewメソッドで、 p session[:_csrf_token]を吐いたところ以下のようになりました。

    Started POST "/users/sign_in" for ::1 at 2019-05-01 21:19:16 +0900
    (0.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
    ↳ vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
    Processing by Users::SessionsController#create as HTML
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"rPknADgldCBF9HMsBKjZm5ydwUBCh/Eh399W1e/poNfeNB6o6Sg8E2duFhx/7+N9/nJhj2zOg0nVdLgzKZSeFw==", "user"=>{"email"=>"kohei.discard@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
    Can't verify CSRF token authenticity.
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT ? [["email", "kohei.discard@gmail.com"], ["LIMIT", 1]]
    ↳ vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
    Redirected to http://localhost:3000/
    Completed 302 Found in 230ms (ActiveRecord: 1.5ms)


    Started GET "/" for ::1 at 2019-05-01 21:19:16 +0900
    Processing by CouponsController#index as HTML
    Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms)


    Started GET "/users/sign_in" for ::1 at 2019-05-01 21:19:16 +0900
    Processing by Users::SessionsController#new as HTML
    Rendering users/sessions/new.html.erb within layouts/application
    Rendered users/shared/_links.html.erb (2.0ms)
    Rendered users/sessions/new.html.erb within layouts/application (18.3ms)
    "nEJZdFvhUsjrYbuMsyzBPmdO3QcxfD2kSIfF0hFdIqI="
    Completed 200 OK in 2685ms (Views: 2681.9ms | ActiveRecord: 0.0ms)

    Started POST "/users/sign_in" for ::1 at 2019-05-01 21:22:33 +0900
    Processing by Users::SessionsController#create as HTML
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"iw1V7YKAbkzfP6t8LvH6avNDbudM89Dezgoem8tYs0sXTwyZ2WE8hDReEPCd3TtUlA2z4H2P7XqGjdtJ2gWR6Q==", "user"=>{"email"=>"kohei.discard@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
    Can't verify CSRF token authenticity.
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT ? [["email", "kohei.discard@gmail.com"], ["LIMIT", 1]]
    ↳ vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
    Completed 401 Unauthorized in 183ms (ActiveRecord: 0.2ms)


    Processing by Users::SessionsController#new as HTML
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"iw1V7YKAbkzfP6t8LvH6avNDbudM89Dezgoem8tYs0sXTwyZ2WE8hDReEPCd3TtUlA2z4H2P7XqGjdtJ2gWR6Q==", "user"=>{"email"=>"kohei.discard@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
    Can't verify CSRF token authenticity.
    Rendering users/sessions/new.html.erb within layouts/application
    Rendered users/shared/_links.html.erb (1.3ms)
    Rendered users/sessions/new.html.erb within layouts/application (5.7ms)
    "oZ8AR5dC+QMRb2JMlglvRMQ4qrkOdiKe1bYsyDC2l04="
    Completed 200 OK in 440ms (Views: 274.7ms | ActiveRecord: 0.0ms)

    確かにsessionで保持しているものと、この度、authenticity_tokenをキーとして送られたコードは異なっているようです。

    またapplication_controllerの間違いでした。

    キャンセル

  • 2019/05/02 14:57

    なぜ、tokenが異なるのか調査する必要があります。
    csrf tokenの切り替わるタイミングで、htmlに添付し、デフォルトのsession保存先としてcookieを指定していれば、cookieに暗号化されたcsrf tokenが渡されるはずです。
    今回、cookie(おそらく)とhtmlに添付されているものとの間で食い違いが起きていることが `Can't verify CSRF token authenticity.`を起こしていると思われます。
    また、ヒントを見つける手助けとして、railsが用意しているform_forを使うと、railsはhtml上に設置してあるcsrf tokenを自動的に取得し、送る仕様になっています。
    私としては、サーバー側で何か原因があるような気がするのですが、今のままではわかりません。

    キャンセル

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • Deviseで正しいメールアドレスとパスワードを入れてもログインできずにリダイレクトで無限ループしてしまう