1.

Google OAuth 2.0 主要エラー一覧と対処法|invalid_grantなど

編集
この記事の要点
  • Google OAuth 2.0 で返るエラーは RFC 6749 準拠の error コードと Google 固有の文字列が混在
  • 頻出: invalid_request / invalid_client / invalid_grant / redirect_uri_mismatch / access_denied
  • redirect_uri_mismatchCloud Console の「承認済みリダイレクト URI」と完全一致が必要(末尾スラッシュ・http/https・ポートまで含む)
  • invalid_grantリフレッシュトークン無効化(再同意 / パスワード変更 / 7日経過の未公開アプリ)が多い
  • スコープ変更時は再同意 (consent) が必要。prompt=consent で強制可

Google OAuth 2.0 のエラーレスポンス

Google の OAuth 2.0 エンドポイント(accounts.google.com/o/oauth2/v2/authoauth2.googleapis.com/token)が返すエラーは、RFC 6749 で定められた error / error_description の形式で返ります。原因究明には error_description と Cloud Console の OAuth クライアント設定の突き合わせが基本です。

// token エンドポイントの例
{
  "error": "invalid_grant",
  "error_description": "Token has been expired or revoked."
}

主要エラー一覧と対処

error意味主な原因 / 対処
invalid_requestパラメータ不足 / 形式不正必須パラメータ(client_id, redirect_uri, response_type, scope)の漏れ。スペル / URL エンコードを確認
invalid_clientクライアント認証失敗client_id / client_secret の値が違う。シークレットを再生成して環境変数を更新
invalid_grant付与情報が無効リフレッシュトークン失効、認可コードを 2 回使った、コード期限切れ(数十秒)、ユーザがパスワード変更、未公開アプリで 7 日経過、時刻ずれ
unauthorized_clientクライアントが許可されていないそのクライアントタイプに許可されていないグラントを使った。Cloud Console のアプリ種別を確認
unsupported_grant_type未対応 grant_typeサポートされる: authorization_code / refresh_token / urn:ietf:params:oauth:grant-type:jwt-bearer
invalid_scopeスコープ不正スコープ文字列のスペル誤り、有効化していない API のスコープ要求
access_deniedユーザが同意を拒否同意画面で「許可しない」を押した。アプリ未公開で対象外ユーザがログインした場合も発生
redirect_uri_mismatchリダイレクト URI 不一致Cloud Console の「承認済みリダイレクト URI」と完全一致していない。プロトコル / ポート / 末尾スラッシュ / クエリすべて含む
admin_policy_enforcedWorkspace 管理者が制限組織管理者がアプリを許可していない
disallowed_useragent埋め込み WebView 拒否WebView / 古い UA からのログインは 2021 年以降不可。システムブラウザを使う
org_internal組織内ユーザ限定「内部」公開設定のアプリに組織外ユーザがアクセス
deleted_client削除済みクライアントCloud Console で削除した client_id を使っている
idpiframe_initialization_failed旧 GIS / GAPI クライアント側サードパーティ Cookie 無効化など。新 GIS(Google Identity Services)に移行

頻発: redirect_uri_mismatch

OAuth 開発で最も詰まるのがこれです。Google は文字列の完全一致を見ています。

Cloud Console 登録リクエスト URI結果
http://localhost:3000/callbackhttp://localhost:3000/callbackOK
http://localhost:3000/callbackhttp://localhost:3000/callback/NG(末尾スラッシュ)
http://localhost:3000/callbackhttp://127.0.0.1:3000/callbackNG(ホスト名違い)
https://app.example.com/cbhttp://app.example.com/cbNG(プロトコル違い)

頻発: invalid_grant

下記いずれかで起きます。とくにリフレッシュトークンの失効条件を覚えておくとよいです。

  • 認可コードを2 回トークンエンドポイントに送った
  • 認可コードの有効期限切れ(数十秒〜数分)
  • ユーザがパスワードを変更した、または「アカウントへのアクセス権を取り消し」した
  • 未公開(テスト)アプリのリフレッシュトークンは7 日で失効
  • サーバの時刻ずれ(JWT で iat/exp が不整合)
  • 1 ユーザあたり 100 個を超えるリフレッシュトークンを発行(古いものから失効)

同意のリセットと再取得

スコープを追加した、または失効したリフレッシュトークンを取り直したいときは、認可リクエストに prompt=consentaccess_type=offline を付けます。

https://accounts.google.com/o/oauth2/v2/auth
  ?client_id=...
  &redirect_uri=https://app.example.com/oauth/callback
  &response_type=code
  &scope=openid%20email%20profile
  &access_type=offline       (リフレッシュトークン要求)
  &prompt=consent            (毎回同意画面を出して再発行)
  &state=xxxxxxxx

デバッグの手順

  1. errorerror_description を必ずログに残す
  2. Cloud Console の OAuth クライアント設定(種別 / 承認済み JS 元 / 承認済みリダイレクト URI)を再確認
  3. 使っているスコープに対応する API が「有効な API とサービス」で有効化されているか
  4. 未公開アプリならテストユーザに対象 Google アカウントを追加
  5. サーバ時刻が NTP で同期されているか確認

関連

  • Google OAuth 2.0 — 親記事
  • OAuth 2.0 — 標準仕様(RFC 6749)
  • OpenID Connect — 認証層
  • Google Cloud Console — クライアント管理
編集
Post Share
子ページ
  1. Client error: POST https://accounts.google.com/o/oauth2/token
  2. Client error: GET https://www.googleapis.com/plus/v1/people/me?prettyPrint=false
同階層のページ

同階層のページはありません

最近更新/作成されたページ