跳转到内容
搜索文档

应用程序令牌

最后更新 查看 MarkdownAgent 设置

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) 标签
email 经过身份验证的用户的电子邮件地址,由身份提供商验证。
exp 令牌的过期时间戳(Unix 时间)。
iat 令牌的签发时间戳(Unix 时间)。
nbf 令牌的生效时间戳(Unix 时间),用于检查令牌是否在其应被使用之前收到。
iss 应用程序的 Cloudflare Access 域 URL。
type Access 令牌的类型(app 代表应用程序令牌,或 org 代表全局会话令牌)。
identity_nonce 用于获取用户身份的缓存键。
sub 用户的 ID。此值在每个账户的电子邮件地址中是唯一的。如果用户从您的 Zero Trust 组织中被移除并重新添加,或者如果他们登录到不同的组织,他们将获得不同的 sub
country 用户进行身份验证的国家/地区。

自定义 SAML 属性和 OIDC 声明

如果您的身份提供商支持,Access 允许您向 JWT 添加自定义 SAML 属性和 OIDC 声明以进行增强验证。这会在您设置 SAMLOIDC 提供商时进行配置。只有当您将 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-identity

Access 将返回一个包含以下数据的 JSON 结构:

字段 描述
email 用户的电子邮件地址。
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

这篇文档对您有帮助吗?