Google Cloud で使うトークンについてのまとめ

# はじめに
Google Cloud（GC）を利用する際にトークンを利用する機会があります。例えば「認証が必要」設定のCloud Runにアクセスする場合などです。
そんなとき、どれが何のトークンだ？と困ってしまうことがありそうなので整理のためにまとめます。


# アクセストークン
アクセストークンは、独自形式のトークンですJWT形式ではないトークンです。

アクセストークンは、次のコマンドで表示することができます。
`gcloud auth print-access-token`

JWTとは異なる文字列が出力されています。このトークンを用いて次のようなcurlコマンドを実行すると情報がかえってきます。
`curl "https://oauth2.googleapis.com/tokeninfo?access_token=<ACCESS_TOKEN>"`

```json
{
  "azp": "~~~~~~~~~~~~~~~~~~~~~",
  "aud": "~~~~~~~~~~~~~~~~~~~~~",
  "sub": "~~~~~~~~~~~~~~~~~~~~~",
  "scope": "~~~~~~~~~~~~~~~~~~~~~",
  "exp": "1745298734",
  "expires_in": "3574",
  "email": "test@example.com",
  "email_verified": "true",
  "access_type": "offline"
}
```

各フィールドの内容は表の通りです。
|  フィールド名  |  概要  |
| ---- | ---- |
|  azp  |  	トークンをリクエストしたアプリケーションのプロジェクト、メール、またはサービス アカウント ID  |
|  aud  |  アクセストークンのオーディエンス。トークンの受取先のサービスアカウントのIDなど  |
|  sub  |  トークンのリクエストを行った実態を識別する一意のID  |
|  scope  |  このアクセス トークンに追加された OAuth スコープ。トークンが付与された権限の範囲となる |
|  exp   |  トークンの有効期限をUNIX時間で表したもの。例で示した値はJTCにすると2025年04月22日 14:12:14となる|
|  expires_in  |  トークンが失効するまでの時間。デフォルトで1時間に設定されている  |
|  email  |  トークンをリクエストしたユーザーのメールアドレス  |
|  email_verified  |  トークンが失効するまでの時間。デフォルトで1時間に設定されている  |
|  access_type   |  offlineの場合、初回認証時にリフレッシュトークンが発行されるonlineの場合発行されない。指定していないとonlineとして扱われる  |

## 用途
アクセストークンはGCの各種APIにアクセスする（実行する）際利用するトークンです。例えばCloud Storageなどへの認可ありリクエストを実行するときに用います。

# IDトークン
IDトークンはOIDCに準拠したJWT形式のトークンです。

IDトークンは、次のコマンドで表示することができます。
`gcloud auth print-identity-token`

上記のコマンドを実行するとJWT形式のトークンが出力されます。このトークンを以下のcurlコマンドで実行するとトークンの情報を見ることができます。

`curl "https://oauth2.googleapis.com/tokeninfo?id_token=<ID_TOKEN>"`

```json
{
  "iss": "https://accounts.google.com",
  "azp": "~~~~~~~~~~~~~~~~~~~~~",
  "aud": "~~~~~~~~~~~~~~~~~~~~~",
  "sub": "~~~~~~~~~~~~~~~~~~~~~",
  "hd": "~~~~~~~~~~~~~~~~~~~~~",
  "email": "test@example.com",
  "email_verified": "true",
  "at_hash": "~~~~~~~~~~~~~~~~~~~~~",
  "iat": "1745299988",
  "exp": "1745303588",
  "alg": "RS256",
  "kid": "~~~~~~~~~~~~~~~~~~~~~",
  "typ": "JWT"
}
```

各フィールドの内容は表の通りです。
|  フィールド名  |  概要  |
| ---- | ---- |
|  iss  |  トークンを発行した主体（署名者） Google によって署名された ID トークンの場合、この値は https://accounts.google.com  |
|  azp  |  トークンの発行者	トークンをリクエストしたアプリケーションのプロジェクト、メール、またはサービス アカウント ID  |
|  aud  |  アクセストークンのオーディエンス。トークンの受取先のサービスアカウントのIDなど  |
|  sub  |  トークンのリクエストを行った実態を識別する一意のID  |
|  hd  | ホストドメイン 組織に属している場合、組織のドメインになるようである |
|  email  |  トークンをリクエストしたユーザーのメールアドレス  |
|  email_verified  |  トークンが失効するまでの時間。デフォルトで1時間に設定されている  |
|  at_hash   |  IDトークンと対応するアクセストークンのハッシュ  |
|  iat   |  トークンの発行時間をUNIX時間で表したもの。例で示した値はJTCにすると2025年04月22日 14:33:08となる|
|  exp   |  トークンの有効期限をUNIX時間で表したもの。例で示した値はJTCにすると2025年04月22日 15:33:08となる|
|  alg    |  JWTの署名に使用されたアルゴリズム|
|  kid    |  トークンを検証するための鍵を特定するために使用されるID。Googleの公開鍵の中でこのIDに対応しているものが使用される|
|  kid    |  トークンのタイプ|

## 用途
主にCloud RunやCloud Functionの認証やIdentity Aware Proxy(IAP)によって保護されたアプリケーションへのアクセスなど


# `gcloud auth`と`gcloud auth application-default`
アクセストークンを取得する際、以下のように2種類の方法でアクセストークンを出力することができます。

`gcloud auth print-access-token`
`gcloud auth application-default print-access-token`

これらの違いとして次のようなものがあります。

### gcloud auth
主にgcloud CLIやSDK全体で使用される認証であり、ユーザーがgcloudコマンドを使って操作をする際に使用されるアカウント（資格）情報を取り扱います。

### gcloud auth application-default
アプリケーションがGoogle Cloudの各種APIにアクセスしたり、コードからAPIにアクセスする際のアカウント（資格）情報を取り扱います。
例えば、terraformコマンドを実行する際に用いられるのはこちらで設定した資格情報です。


このように、`gcloud auth`と`gcloud auth application-default`では資格情報を別々に管理しています。
そのため `gcloud auth login`と`gcloud auth application-default login`はどちらもブラウザ経由で認証するという似たような画面で設定しますが、認証情報が設定されるスコープは異なるため、間違ったほうにログインすると、できているはずなのに資格情報がない、や権限足りないというエラーに遭遇してしまうことになるということに注意が必要です。

# おまけ
`gcloud auth application-default login`で設定される認証情報はApplication Default Credentials (ADC) と呼ばれます。
ADCを取り扱う際に、gcloudでのログインのほかに、`GOOGLE_APPLICATION_CREDENTIALS`という環境変数を用いることができます。例えば、この環境変数にサービスアカウントのキーであるJsonファイルのファイルパスを指定することでそのサービスアカウントをADCの認証に用いることができます。

`GOOGLE_APPLICATION_CREDENTIALS`と`gcloud auth application-default login`を両方用いた場合、環境変数`GOOGLE_APPLICATION_CREDENTIALS`に設定された情報が優先されるということに気を付ける必要があります。

# 参考

https://cloud.google.com/docs/authentication/token-types?hl=ja

https://cloud.google.com/sdk/gcloud/reference/auth


https://cloud.google.com/docs/authentication/application-default-credentials?hl=ja