跳转到内容
搜索文档

JSON Web Tokens 验证

最后更新 查看 MarkdownAgent 设置

JSON Web 令牌 (JWT) 通常用作许多 Web 应用程序上身份验证组件的一部分。由于 JWT 对于识别用户及其访问权限至关重要,因此确保令牌的完整性非常重要。

API Shield 的 JWT 验证通过在将传入的 JWT 传递给您的 API 源站之前对其进行密码学验证,来阻止 JWT 重放攻击和 JWT 篡改。JWT 验证还将阻止使用已过期令牌或尚未生效令牌的请求。

过程

必须将端点添加到端点管理中才能进行 JWT 验证以保护它们。

JWT 验证配置由两部分组成:包含您的 JWT 签署者公共 JSON Web 密钥集 (JWKS) 的令牌验证配置,以及指定要验证哪些主机名和端点的 JWT 验证规则。

添加令牌验证配置

  1. 在 Cloudflare 仪表板中,前往安全 Settings(设置) 页面。

    Go to Settings ↗
  2. API 滥用 过滤。

  3. Token configuration(令牌配置) 上,选择 Configure tokens(配置令牌)

  4. 为您的配置添加名称。

  5. 选择 Cloudflare 在传入请求中可以在何处找到此配置的 JWT(例如标头或 cookie)及其名称。

  6. 复制并粘贴您的 JWT 签发者的公钥 (JWKS)。

  1. 登录到 Cloudflare 仪表板,然后选择您的账户和域。
  2. 转到 Security(安全性) > API Shield > Settings(设置)
  3. JSON Web Token Settings(JSON Web Token 设置) 下,选择 Add configuration(添加配置)
  4. 为您的配置添加名称。
  5. 选择 Cloudflare 在传入请求中可以在何处找到此配置的 JWT(例如标头或 cookie)及其名称。
  6. 复制并粘贴您的 JWT 签发者的公钥 (JWKS)。

每个 JWT 签发者通常在互联网上的已知 URL 处发布公钥 (JWKS) 以供验证。如果您不知道从哪里获取它们,请联系您的身份管理员。

要在您的身份提供商刷新公钥时自动使您的 JWKS 保持最新,您可以使用 Worker。请参阅配置 Workers 以自动更新密钥以了解有关设置 Worker 的更多信息。

添加 JWT 验证规则

  1. 在 Cloudflare 仪表板中,前往安全 规则 页面。

    Go to Security rules ↗
  2. 在 API JWT 验证规则上,选择 Create rule(创建规则)

  3. 为您的规则添加名称。

  4. 选择主机名,以使用该规则保护包含已保存端点的请求。

  5. 取消勾选您希望 JWT 验证忽略的任何端点(例如用于生成 JWT 的端点)。

  6. 选择与传入请求相对应的令牌验证配置。

  7. 选择是否在这些端点上严格强制要求令牌存在。

    • 您可能不期望 100% 的客户端在其请求中发送 JWT。如果是这种情况,请选择 忽略 (Ignore)。JWT 验证仍将验证存在的 JWT。
    • 否则,您可能期望所有发往所选主机名和端点的请求都包含 JWT。如果是这种情况,请选择 标记为不合规 (Mark as non-compliant)
  8. 选择对不合规请求采取的操作。例如,未通过验证的 JWT(已过期、被篡改或签名错误的令牌),或者在前面步骤中选择 标记为不合规 时缺少 JWT 的请求。

  9. 选择 Save(保存)

  1. 登录到 Cloudflare 仪表板,然后选择您的账户和域。
  2. 前往 Security(安全性) > API Shield > API 规则
  3. 为您的规则添加名称。
  4. 选择主机名,以使用该规则保护包含已保存端点的请求。
  5. 取消勾选您希望 JWT 验证忽略的任何端点(例如用于生成 JWT 的端点)。
  6. 选择与传入请求相对应的令牌验证配置。
  7. 选择是否在这些端点上严格强制要求令牌存在。
    • 您可能不期望 100% 的客户端在其请求中发送 JWT。如果是这种情况,请选择 忽略 (Ignore)。JWT 验证仍将验证存在的 JWT。
    • 否则,您可能期望所有发往所选主机名和端点的请求都包含 JWT。如果是这种情况,请选择 标记为不合规 (Mark as non-compliant)
  8. 选择对不合规请求采取的操作。例如,未通过验证的 JWT(已过期、被篡改或签名错误的令牌),或者在前面步骤中选择 标记为不合规 时缺少 JWT 的请求。
  9. 选择 Save(保存)

特殊情况

在单个请求中验证两个具有不同身份提供商的 JWT

如果您期望在请求中应该存在两个不同的 JWT 并且您想验证这两个 JWT,您必须创建两个不同的令牌配置。在您的验证规则中选择这两个配置时,在 多个配置的验证行为 下选择 验证所有配置

支持从一个身份提供商迁移到另一个身份提供商

如果您期望在两个不同的身份提供商之间进行迁移,您必须创建两个不同的令牌配置和两个不同的验证规则,每个规则对应其自己的配置。通过此设置,您可以根据迁移状态更改不同验证规则的操作。

带有 Bearer 前缀的 JSON Web Token

无论 JSON Web Token 是否具有 Bearer 前缀,API Shield 都会对其进行验证。

按用户(JWT 声明)进行速率限制

您可以基于 JSON Web Token (JWT) 中的任何声明(claim)对请求进行速率限制,例如:

  • 注册声明,如 audsub
  • 自定义声明,如 userEmail,包括嵌套自定义声明,如 user.email

基于 JWT 声明值的速率限制仅对有效的 JSON Web Token 生效。如果您没有在路径上阻止无效的 JSON Web Token,那么如果在业务点(PoP)检测到高流量,JWT 声明将全部被计数并可能会被阻止

您还必须对唯一标识用户的 JWT 声明进行计数。如果您选择了一个对许多用户都相同的声明,他们的速率限制将全部被合并计数。

按用户层级进行速率限制

如果您的网站或应用程序提供多个层级,并且您希望基于这些层级实施速率限制,例如:

  • 如果 "aud": "free-tier",限制为每分钟 5 个请求。
  • 如果 "aud": "premium-tier",限制为每分钟 50 个请求。

您可以参考下面的速率限制规则示例:

Example rule expressiontxt
(http.request.method eq "GET" and
http.host eq "<YOUR_DOMAIN>" and
http.request.uri.path matches "</EXAMPLE_PATH>" and
lookup_json_string(http.request.jwt.claims["<JWT_TOKEN_CONFIGURATION_ID>"][0], "aud") eq "free-tier"

忽略 OPTIONS 预检 CORS 请求

由于跨源资源共享 (CORS) 安全,Web 浏览器在发送 GET(或其他动词)请求之前,会使用 OPTIONS 动词向 API 端点发送“预检”请求。根据定义,OPTIONS 预检请求不包含凭据(身份验证标头或 cookie),并且是匿名的。

如果您的 API 的有效客户端包括 Web 浏览器,并且为了防止阻止来自这些浏览器的 OPTIONS 请求,Cloudflare 建议在您的 JWT 验证规则中添加 or http.request.method eq "OPTIONS"


可用性

所有 API Shield 客户均可使用 JWT 验证。未购买 API Shield 的企业版客户可以在 Cloudflare 仪表板中预览 作为非合同服务的 API Shield,或通过联系您的账户团队来进行预览。


限制

目前存在以下已知限制:

  1. JWT 验证仅对在客户端请求标头或 cookie 中发送的 JWT 起作用。如果您的客户端在 POST 正文中发送 JWT,请将该反馈直接提交给您的账户团队。
  2. JWT 验证仅对添加到端点管理中的 端点(主机、方法和路径)起作用。您可以通过 API 发现架构验证通过 Cloudflare 仪表板手动 或通过 API 将您的所有端点添加到端点管理中。

这篇文档对您有帮助吗?