Cloudflare Access 在发送到您源站的所有经过身份验证的请求中都包含应用程序令牌。典型的 JWT 如下所示:
eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzMzhhYmUxYmFmMmZlNDkyZjY0.eyJhdWQiOlsiOTdlMmFhZ TEyMDEyMWY5MDJkZjhiYzk5ZmMzNDU5MTNh.zLYsHmLEginAQUXdygQo08gLTExWNXsN4jBc6PKdB
如上所示,JWT 包含三个由点分隔的 Base64-URL 值:
除非您的应用程序是通过 Cloudflare Tunnel 连接到 Access,否则您的应用程序必须验证令牌以确保您源站的安全。仅验证标头是不够的 —— 必须确认 JWT 和签名以避免身份欺骗。
{
"alg": "RS256",
"kid": "9338abe1baf2fe492f646a736f25afbf7b025e35c627be4f60c414d4c73069b8",
"typ": "JWT"
}alg识别编码算法。kid识别用于对令牌进行签名的密钥。typ指定令牌格式。
有效负载包含要传递给应用程序的实际声明和用户信息。有效负载内容会有所不同,具体浮动于您是使用身份提供商还是使用服务令牌向应用程序进行身份验证。
{
"aud": ["32eafc7626e974616deaf0dc3ce63d7bcbed58a2731e84d06bc3cdf1b53c4228"],
"email": "[email protected]",
"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 提供商时进行配置。只有当您将 groups 显式配置为自定义 SAML 属性或 OIDC 声明时,身份提供商组才会包含在令牌中。Access 不会自动添加它们。
用户身份对于检查应用程序权限很有用。例如,您的应用程序可以验证给定用户是否是 Okta 或 Microsoft Entra ID 组(例如 Finance-Team)的成员。
出于 cookie 大小限制和带宽考虑,应用程序令牌仅包含用户身份的一个子集。若要获取用户的完整身份,请将 CF_Authorization cookie 发送到 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 | 用于身份验证的服务令牌的 Client ID。 |
| service_token_status | 如果身份验证是通过服务令牌而不是 IdP 进行的,则为 True。 |
| is_warp | 如果用户启用了 WARP,则为 True。 |
| is_gateway | 如果用户启用了 Cloudflare One 客户端并对 Zero Trust 团队进行了身份验证,则为 True。 |
| gateway_account_id | 在对 Zero Trust 团队进行身份验证时,由 Cloudflare One 客户端生成的 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 | 服务令牌的 Client ID (CF-Access-Client-Id)。 |
| iat | JWT 的签发时间戳(Unix 时间)。 |
| sub | 当身份验证是通过服务令牌进行时,包含一个空字符串。 |
Cloudflare 通过使用 SHA-256 算法 (RS256) 对编码的标头和有效负载进行签名来生成签名。在 RS256 中,私钥对 JWT 进行签名,而单独的公钥验证签名。
有关 JWT 的更多信息,请参阅 jwt.io ↗。