缓存令牌 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

缓存令牌

每次您想要获取新的 JSON Web 令牌(JWT)时,应用程序都必须成功完成以下请求之一。

  • 令牌端点请求客户端凭证或授权代码授予

  • 从您的托管 UI 请求隐式授权。

  • 在 Amazon Cognito API 请求中对本地用户进行身份验证,例如。InitiateAuth

您可以将用户群体配置为将令牌设置为在数分钟、数小时或数天后过期。要确保应用程序的性能和可用性,请使用 Amazon Cognito 令牌直到它们过期,并且仅在那时检索新令牌。您为应用程序构建的缓存解决方案可保持令牌可用,并可防止 Amazon Cognito 在您的请求速率过高时拒绝请求。客户端应用程序必须将令牌存储在内存缓存中。服务器端应用程序可以添加加密的缓存机制来存储令牌。

当您的用户池生成大量用户或 machine-to-machine 活动时,您可能会遇到 Amazon Cognito 对您可以发出的令牌请求数量设定的限制。要减少您向 Amazon Cognito 端点发出的请求数量,可以安全地存储和重复使用身份验证数据,也可以实施指数回退和重试。

身份验证数据来自两类端点。Amazon Cognito OAuth 2.0 端点包括令牌端点,该端点为客户端凭证和托管 UI 授权代码请求提供服务。服务端点应答用户群体 API 请求,例如 InitiateAuthRespondToAuthChallenge。每种类型的请求都有自己的限制。有关 限制的更多信息,请参阅 Amazon Cognito 中的限额

使用 Amazon API Gateway 缓存 machine-to-machine 访问令牌

借助 API Gateway 令牌缓存,您的应用程序可以横向缩减对大于 Amazon Cognito OAuth 端点的默认请求速率配额的事件的响应。

您可以缓存访问令牌,以便您的应用程序仅在缓存的令牌过期时才请求新的访问令牌。否则,您的缓存端点会从缓存中返回一个令牌。这会阻止对 Amazon Cognito API 端点的其他调用。当您使用 Amazon API Gateway 作为 令牌端点的代理时,您的 API 会响应大多数原本会计入您的请求配额的请求,从而避免由于速率限制而导致的请求失败。

以下基于 API Gateway 的解决方案提供了低延迟、低代码/无代码的令牌缓存实施。API Gateway API 在传输中加密,也可以选择静态加密。API Gateway 缓存非常适合 OAuth 2.0 客户端凭证授予,OAuth 2.0 客户端凭证授予通常是大批量的授予类型,用于生成用于授权 machine-to-machine 和微服务会话的访问令牌。在诸如流量激增导致您的微服务水平扩展的情况下,您最终可能会有许多系统使用相同的客户端凭据,但其数量超过用户池或应用程序客户端的 Amazon 请求速率限制。要保持应用程序可用性和低延迟,缓存解决方案是此类情况下的最佳实践。

在此解决方案中,您在 API 中定义缓存,以便为您要在应用程序中请求的 OAuth 范围和应用程序客户端的每种组合存储单独的访问令牌。当您的应用程序发出与缓存键匹配的请求时,您的 API 会使用 Amazon Cognito 向与缓存键匹配的第一个请求颁发的访问令牌进行响应。当您的缓存键持续时间到期时,API 会将请求转发到令牌端点并缓存新的访问令牌。

注意

您的缓存键持续时间必须短于应用程序客户端的访问令牌持续时间。

缓存键是您在 scope URL 参数中请求的 OAuth 范围和请求中的 Authorization 标头的组合。Authorization 标头包含您的应用程序客户端 ID 和客户端密钥。您无需在应用程序中实施其他逻辑即可实施此解决方案。您只必须更新配置以更改用户群体令牌端点的路径。

您也可以使用 for Redis ElastiCache 实现令牌缓存。要使用 Amazon Identity and Access Management (IAM) 策略进行精细控制,请考虑 Amazon DynamoDB 缓存。

注意

在 API Gateway 中缓存需要支付额外费用。有关更多详细信息,请参阅定价。

使用 API Gateway 设置缓存代理

  1. 打开 API Gateway 控制台,然后创建一个 REST API。

  2. Resources(资源)中,创建一个 POST 方法。

    1. 选择 HTTP Integration type(集成类型)。

    2. 选择 Use HTTP proxy integration(使用 HTTP 代理集成)。

    3. 输入 Endpoint URL(端点 URL)https://<your user pool domain>/oauth2/token

  3. Resources(资源)中,配置缓存键。

    1. 编辑 POST 方法的 Method request(方法请求)。

    2. 将您的 scope 参数和 Authorization 标头设置为缓存键。

      1. URL query string parameters(URL 查询字符串参数)中添加一个查询字符串,并为 scope 字符串选择 Caching(缓存)。

      2. HTTP request headers(HTTP 请求标头)中添加一个标头,并为 Authorization 标头选择 Caching(缓存)。

  4. Stages(阶段)中,配置缓存。

    1. 选择您想要修改的阶段。

    2. Settings(设置)下,选择 Enable API cache(启用 API 缓存)。

    3. 选择 Cache capacity(缓存容量)。

    4. 选择至少 3600 秒的缓存 time-to-live (TTL)

    5. 清除需要授权复选框。

  5. Stages(阶段)中,注意 Invoke URL(调用 URL)。

  6. 更新您的应用程序,以将令牌请求发布到 API 的 Invoke URL(调用 URL)而不是用户群体的 /oauth2/token 端点。