Google Cloud Platform で OAuth 2.0 grant_type=refresh_token 使用時の「Token has been expired or revoked」エラーの対処法



問題の概要

Google Cloud Platform(GCP)の OAuth 2.0 フローで grant_type=refresh_token を使用してリフレッシュトークンリクエストを行う際、以下のようなリクエストでリフレッシュトークンから新しいアクセストークンを取得しようとするとエラーが発生することがあります:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=your_client_id&
client_secret=your_client_secret&
refresh_token=refresh_token&
grant_type=refresh_token

正常時のレスポンス:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "token_type": "Bearer"
}

しかし、代わりに以下のようなエラーが返されることがあります:

{
  "error": "invalid_grant",
  "error_description": "Token has been expired or revoked."
}

エラーが発生する原因

Google のドキュメントによると、このエラーは以下のような状況で発生する可能性があります:

  • ユーザーがアプリへのアクセスを取り消した。
  • リフレッシュトークンが 6 ヶ月間使用されていない。
  • ユーザーがパスワードを変更し、トークンに Gmail スコープが含まれている。
  • ユーザーアカウントで発行されたリフレッシュトークンの最大数を超えた。
  • OAuth 同意画面が External に設定されており、Testing ステータスのままの場合、発行されたリフレッシュトークンは 7 日後 に有効期限が切れます。

OAuth 2.0 を使用して Google API にアクセスする場合、以下のような OAuth 同意画面を設定する必要があります。

これらの設定では、7 日後に有効期限が切れるリフレッシュトークンが発行されます。リフレッシュトークンは通常、これらの特殊な状況を除いて長期間有効であるため、この動作は開発者を驚かせることがよくあります。

内部のバッチジョブやテスト環境でトークンを使用する場合は、有効期限の短いリフレッシュトークンに依存するよりも、サービスアカウントを使用する方が適切です。


認証情報に関する一般的なエラーメッセージ

認証情報が正しくない場合に返される一般的なエラーレスポンスを以下に示します:

  • ClientId または ClientSecret が無効な場合:
    {
      "error": "invalid_client",
      "error_description": "Unauthorized"
    }
  • refresh_token が正しくない場合:
    {
      "error": "invalid_grant",
      "error_description": "Bad Request"
    }

レスポンスメッセージは状況によって異なるため、常にコンテキストを確認することが重要です。これにより、実際の問題を特定しやすくなります。


CData ドライバーでの対応

CData の GCP 接続ドライバー、例えば Google BigQuery ドライバーGoogle Drive ドライバーは、CData が提供する組み込みの ClientID と ClientSecret を持つ適切に設定された OAuth 認証情報を使用しています。そのため、テストモードで独自の OAuth アプリと認証情報を明示的に設定しない限り、「expired or revoked」のリフレッシュトークンエラーを回避できます。


ぜひお試しください

CData では、Google BigQueryGoogle DriveGoogle Ads ドライバーをはじめ、CData のあらゆる接続ソリューションの 30 日間無料トライアルを提供しています。ぜひトライアルをダウンロードして、さまざまなアプリケーションとデータソース間のシームレスな接続をお試しください。