こちらの記事に参考にGoogleアカウントでの認証を実装していました。
https://qiita.com/yuki_0920/items/003d8b1c73352378188d
実際の画面でも、RSpecのテストでも下記のエラーに結構苦戦したので、残しておく。
前提条件
環境
Docker Rails 6.0.3 MySQL devise omniauth omniauth-google-oauth2The action 'google_oauth2' could not be found for Devise::OmniauthCallbacksController
コントローラーやモデル、ルーティングの設定が終わり、View上に「Sign in with GoogleOauth2」の自動リンクが作成され、いざ認証をテストすると、
このエラー・・・
Devise::OmniauthCallbacksControllerには「google_oauth2」というアクションは見つからないよ
と返ってきます。
結論
routes.rbを確認しよう!!
今回の実装方法ではDevise::OmniauthCallbacksControllerを継承したUsers::OmniauthCallbacksControllerに「google_oauth2」を定義しているので、コントローラーへのルーティングがミスっているということは検討はついていた。
どこにも間違いはないのに・・・
はい。間違っていました。
# 間違い
devise_for :users, controller: {
:registrations => 'users/registrations',
:sessions => 'users/sessions',
:omniauth_callbacks => 'users/omniauth_callbacks'
}
# 正解
devise_for :users, controllers: {
:registrations => 'users/registrations',
:sessions => 'users/sessions',
:omniauth_callbacks => 'users/omniauth_callbacks'
}
controllerが単数形になっていたことが原因でした。
おまけ
エラー解決にあたり、グーグルのクライアントIDやシークレットキーや環境変数の入力間違いでこうなっているのでは?とかも考えました。
実際は違ったわけですが、その場合のエラーも一応残しておきます。
「Sign in with GoogleOauth2」のリンクをクリックした時点で「承認エラー」がでます。
もしこの部分が間違っていて、.envファイル
を修正した場合はdocker-compose up しなおさないとダメです。