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作成,編集(※最後のほうに補足有り)
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ファイルのコードを編集したらエラーが解消されました。
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"
↓変更後↓
config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],
ENV['GOOGLE_CLIENT_SECRET']
余計なものが書かれちゃっていたみたいです。。。
反省点
エラー該当コードの書かれている意味を理解していなかった。
公式ドキュメントちゃんと読んでいなかった。
※補足(11/12編集)
Rails.application.config.middleware.use OmniAuth::Builder do
{:provider_ignores_state => true}
end
このコードはかえってCSRF攻撃を受けやすくなってしまうため不要。