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