アプリケーショントークン
Cloudflare Accessは、オリジンへのすべての認証済みリクエストにアプリケーショントークンを含めます。典型的なJWTは次のようになります:
eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzMzhhYmUxYmFmMmZlNDkyZjY0.eyJhdWQiOlsiOTdlMmFhZTEyMDEyMWY5MDJkZjhiYzk5ZmMzNDU5MTNh.zLYsHmLEginAQUXdygQo08gLTExWNXsN4jBc6PKdB
上記のように、JWTはドットで区切られた3つのBase64-URL値を含んでいます:
アプリケーションがCloudflare Tunnelを介してAccessに接続されていない限り、アプリケーションはオリジンのセキュリティを確保するためにトークンを検証する必要があります。ヘッダーのみの検証では不十分であり、JWTと署名を確認してアイデンティティの偽装を避ける必要があります。
{ "alg": "RS256", "kid": "9338abe1baf2fe492f646a736f25afbf7b025e35c627be4f60c414d4c73069b8", "typ": "JWT"}algはエンコーディングアルゴリズムを識別します。kidはトークンに署名するために使用されるキーを識別します。typはトークンのフォーマットを指定します。
ペイロードには、アプリケーションに渡す実際のクレームとユーザー情報が含まれています。ペイロードの内容は、アイデンティティプロバイダーを使用してアプリケーションに認証したか、サービストークンを使用したかによって異なります。
{ "aud": ["32eafc7626e974616deaf0dc3ce63d7bcbed58a2731e84d06bc3cdf1b53c4228"], "email": "user@example.com", "exp": 1659474457, "iat": 1659474397, "nbf": 1659474397, "iss": "https://yourteam.cloudflareaccess.com", "type": "app", "identity_nonce": "6ei69kawdKzMIAPF", "sub": "7335d417-61da-459d-899c-0a01c76a2f94", "country": "US"}| フィールド | 説明 |
|---|---|
| aud | Accessアプリケーションのアプリケーションオーディエンスタグ (AUD)。 |
| アイデンティティプロバイダーによって確認された認証済みユーザーのメールアドレス。 | |
| exp | トークンの有効期限のタイムスタンプ(Unix時間)。 |
| iat | トークンの発行タイムスタンプ(Unix時間)。 |
| nbf | トークンの使用前タイムスタンプ(Unix時間)、トークンが使用される前に受信されたかどうかを確認するために使用されます。 |
| iss | アプリケーションのCloudflare AccessドメインURL。 |
| type | Accessトークンのタイプ(アプリケーショントークンの場合はapp、グローバルセッショントークンの場合はorg)。 |
| identity_nonce | ユーザーのアイデンティティを取得するために使用されるキャッシュキー。 |
| sub | ユーザーのID。この値はアカウントごとにメールアドレスに固有です。ユーザーが削除され、Zero Trust組織に再追加されるか、異なる組織にログインすると、異なるsubが与えられます。 |
| country | ユーザーが認証した国。 |
Accessは、アイデンティティプロバイダーがサポートしている場合、JWTにカスタムSAML属性とOIDCクレームを追加することを許可します。これは、SAMLまたはOIDCプロバイダーを設定する際に構成されます。
ユーザーアイデンティティは、アプリケーションの権限を確認するのに役立ちます。たとえば、アプリケーションは、特定のユーザーがFinance-TeamのようなOktaまたはAzureADグループのメンバーであることを検証できます。
クッキーサイズの制限と帯域幅の考慮により、アプリケーショントークンにはユーザーのアイデンティティのサブセットのみが含まれます。ユーザーの完全なアイデンティティを取得するには、CF_Authorizationクッキーをhttps://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/get-identityに送信します。リクエストは次のように構成する必要があります:
curl -H 'cookie: CF_Authorization=<user-token>' https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/get-identityAccessは、次のデータを含むJSON構造を返します:
| フィールド | 説明 |
|---|---|
| ユーザーのメールアドレス。 | |
| idp | アイデンティティプロバイダーからのデータ。 |
| geo | ユーザーが認証した国。 |
| user_uuid | ユーザーのID。 |
| devicePosture | デバイスポスチャ属性。 |
| account_id | 組織のアカウントID。 |
| iat | ユーザーがログインした時刻を示すタイムスタンプ。 |
| ip | ユーザーのIPアドレス。 |
| auth_status | mTLSで認証している場合のステータス。 |
| common_name | mTLSクライアント証明書のコモンネーム。 |
| service_token_id | 認証に使用されたサービストークンのクライアントID。 |
| service_token_status | IdPではなくサービストークンを介して認証された場合はTrue。 |
| is_warp | ユーザーがWARPを有効にした場合はTrue。 |
| is_gateway | ユーザーがWARPを有効にし、Zero Trustチームに認証された場合はTrue。 |
| gateway_account_id | Zero Trustチームに認証されたときにWARPクライアントによって生成されたID。 |
| device_id | 認証に使用されたデバイスのID。 |
| version | get-identityオブジェクトのバージョン。 |
| device_sessions | ユーザーによって開始されたすべてのセッションのリスト。 |
{ "type": "app", "aud": ["32eafc7626e974616deaf0dc3ce63d7bcbed58a2731e84d06bc3cdf1b53c4228"], "exp": 1659474457, "iss": "https://yourteam.cloudflareaccess.com", "common_name": "e367826f93b8d71185e03fe518aff3b4.access", "iat": 1659474397, "sub": ""}| フィールド | 説明 |
|---|---|
| type | Accessトークンのタイプ(アプリケーショントークンの場合はapp、グローバルセッショントークンの場合はorg)。 |
| aud | Accessアプリケーションのアプリケーションオーディエンスタグ (AUD)。 |
| exp | JWTの有効期限のタイムスタンプ(Unix時間)。 |
| iss | アプリケーションのCloudflare AccessドメインURL。 |
| common_name | サービストークンのクライアントID(CF-Access-Client-Id)。 |
| iat | JWTの発行タイムスタンプ(Unix時間)。 |
| sub | サービストークンを介して認証された場合は空の文字列を含みます。 |
Cloudflareは、エンコードされたヘッダーとペイロードにSHA-256アルゴリズム(RS256)を使用して署名することによって署名を生成します。RS256では、プライベートキーがJWTに署名し、別の公開キーが署名を検証します。
JWTに関する詳細は、jwt.io ↗を参照してください。