omniauth-google-oauth2でscopeを追加するときはemailが必須だった
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
- 時間を大切に
railsに関する他の記事を読む
- google-api-clientを指定してinstallするのはもう非推奨になっていた
- OmniAuthでdeveloper providerを使ってダミーログインをする
- [Rails]取得したクラス名をキャメルケースからスネークケースに変換する
- urlヘルパーをモデルなどでも使う方法
Rubyに関する他の記事を読む
- slimでtype='application/ld+json'のscriptタグを書く
- Slack APIによる自動メッセージでユーザーグループにメンションする方法
- RubyでUnixtimeからTimeオブジェクトを生成する
- gemインストール時にUndefined symbols for architecture arm64と出たときの対応
- RubyでUTCの時刻情報をJST基準に変換する
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら