Rails5 Google認証導入時のエラー


deviseでgoogle認証を導入した際のエラーと解決までの流れを忘却録として残します。
エラー 400: invalid_request Missing required parameter: client_id
↑のエラー記事は見かけるのですが、それとは違うエラーだったので苦戦しました。

認証エラー

ブラウザで新規登録画面でSign in with GoogleOauth2が追加されていることを確認。
リンクに飛ぶと以下のエラーが出た。

log/development.log
# gem 'omniauth-rails_csrf_protection' 追加前

(google_oauth2) Callback phase initiated.
(google_oauth2) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
Processing by Users::OmniauthCallbacksController#failure as HTML
Redirected to http://localhost:3000/users/sign_in
Completed 302 Found in 2ms (ActiveRecord: 0.0ms)

gem 'omniauth-rails_csrf_protection'を入れたら以下のログに変わっていた。

log/development.log
# gem 'omniauth-rails_csrf_protection' 追加後

Started POST "/users/auth/google_oauth2" for ::1 at 2020-11-10 11:59:32 +0900
(google_oauth2) Request phase initiated.


Using OAuth 2.0 to Access Google APIs
エラー
400: invalid_request
エラー内容を直訳
「redirect_uriの無効なパラメーター値:スキームがありません:/ users / auth / google_oauth2 / callback」

やったこと

  • gem 'omniauth-rails_csrf_protection' 追加
  • Contacts API 有効にする
  • gem 'dotenv-rails'に , require: 'dotenv/rails-now'を後述する
  • config/initializers/omniauth.rb作成,編集(※最後のほうに補足有り)
config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  {:provider_ignores_state => true}
end

解決結果とその要因

google認証できました!(deviseのみのログインもOK!)
以下はその際のログです

development.log.rb

Started POST "/users/auth/google_oauth2" for ::1 at 2020-11-10 13:24:48 +0900
(google_oauth2) Request phase initiated.
Started GET "/users/auth/google_oauth2/callback?state=9d59b2ef8ca58e1b5f3ceec217cf860863ac548150829df6&code=4%2F0AY0e-g6FAjat7NwD37kS0-qHTDAs3JDPF4fW_SxnloikU9WVpy_oHNDYU3Rn3t07LRm7XQ&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+openid&authuser=0&prompt=consent" for ::1 at 2020-11-10 13:31:31 +0900
(google_oauth2) Callback phase initiated.
Processing by Users::OmniauthCallbacksController#google_oauth2 as HTML
  Parameters: {"state"=>"9d59b2ef8ca58e1b5f3ceec217cf860863ac548150829df6", "code"=>"4/0AY0e-g6FAjat7NwD37kS0-qHTDAs3JDPF4fW_SxnloikU9WVpy_oHNDYU3Rn3t07LRm7XQ", "scope"=>"email profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid", "authuser"=>"0", "prompt"=>"consent"}
  User Load (5.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`email` = '登録アドレス' ORDER BY `users`.`id` ASC LIMIT 1
   (1.8ms)  BEGIN
  User Exists (5.9ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY '登録アドレス' LIMIT 1
  SQL (10.1ms)  INSERT INTO `users` (`email`, `encrypted_password`, `created_at`, `updated_at`, `name`) VALUES ('登録アドレス', '$2a$12$StAlV8i5S0/ORaZ9DNDPD.6MJaEqY3JGvkIwQb4hulRH5wLazHylm', '2020-11-10 04:31:32', '2020-11-10 04:31:32', '名前')
   (6.1ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 504ms (ActiveRecord: 29.2ms)

解決要因

initializerのdeviseファイルのコードを編集したらエラーが解消されました。

initializers/devise.rb
config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],
                               ENV['GOOGLE_CLIENT_SECRET'], 
                               scope: 'email,calendar', 
                               redirect_uri: "#{ENV['HOST_DOMAIN']}/users/auth/google_oauth2/callback"

↓変更後↓

initializers/devise.rb
config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],
                               ENV['GOOGLE_CLIENT_SECRET']

余計なものが書かれちゃっていたみたいです。。。

反省点

エラー該当コードの書かれている意味を理解していなかった。
公式ドキュメントちゃんと読んでいなかった。

※補足(11/12編集)

config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  {:provider_ignores_state => true}
end

このコードはかえってCSRF攻撃を受けやすくなってしまうため不要。