omniauth-google-oauth2を使ってGoogleによるソーシャルログインをするときにプロフィール情報以外に追加で何かしたユーザーに認可してほしいとき、以下のような形でscopeにこちらが必要と思っている権限名を追加すると思います。

config/initializers/omniauth.rbの設定内容調整。以下はYouTubeのAnalytics&Reporting APIを使うための例です。このscopeの部分は何をやりたいかで色々と変わるでしょう。

ただし、この書き方では動きません

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2,
           ENV['GOOGLE_CLIENT_ID'],
           ENV['GOOGLE_CLIENT_SECRET'],
           scope: %i[youtube youtube.readonly youtubepartner yt-analytics-monetary.readonly yt-analytics.readonly]
end

上記で試してみると以下のように、Invalid Credentialsと返ってきてしまいます。

OAuth2::Error (invalid_request: Invalid Credentials
{
  "error": "invalid_request",
  "error_description": "Invalid Credentials"
}):

正解はscopeにuserinfo.emailまたはuserinfo.profileを入れないといけないです。

これに気が付かずで、半日くらい費やしてしまった・・

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2,
           ENV['GOOGLE_CLIENT_ID'],
           ENV['GOOGLE_CLIENT_SECRET'],
           scope: %i[userinfo.emailyoutube youtube.readonly youtubepartner yt-analytics-monetary.readonly yt-analytics.readonly]
end

omniauth-google-oauth2を見ると、そういう仕様になっていますよということが書いてありました。

早く言ってよ〜

NOTE: While developing your application, if you change the scope in the initializer you will need to restart your app server.
Remember that either the 'email' or 'profile' scope is required!

scopeをこちらで指定しない場合はデフォルトでemailとprofileがscopeになるみたいだけど、上書きするときにデフォルトの設定は踏襲されないらしい。

動作に必要な項目であれば必ず入るようにしたほうがいい気もするが・・

The email and profile scopes are used by default. By defining your own scope, you override these defaults, but Google requires at least one of email or profile, so make sure to add at least one of them to your scope!

どハマりしたので、メモしました。同じような問題にぶち当たった方にひとりでも多く届いてほしい。

この記事の環境情報

  • Ruby 3.1.2
  • rails 7.0.4
  • omniauth 1.9.2
  • omniauth-google-auth2 0.8.0
  • 時間を大切に