管理用户池令牌到期和缓存
每次您想要获取新的 JSON Web 令牌(JWT)时,应用程序都必须成功完成以下请求之一。
-
从您的托管登录页面请求隐式授权。
-
在 Amazon Cognito API 请求(例如 InitiateAuth)中对本地用户进行身份验证。
您可以将用户池配置为将令牌设置为在数分钟、数小时或数天后过期。要确保应用程序的性能和可用性,请使用 Amazon Cognito 令牌至大约 75% 的令牌生命周期,并且仅在那时获取新令牌。您为应用程序构建的缓存解决方案可保持令牌可用,并可防止 Amazon Cognito 在您的请求速率过高时拒绝请求。客户端应用程序必须将令牌存储在内存缓存中。服务器端应用程序可以添加加密的缓存机制来存储令牌。
当您的用户池生成大量用户或机器到机器活动时,您可能会遇到 Amazon Cognito 对您可以发出的令牌请求数量设置的限制。要减少您向 Amazon Cognito 端点发出的请求数量,可以安全地存储和重复使用身份验证数据,也可以实施指数回退和重试。
身份验证数据来自两类端点。Amazon Cognito OAuth 2.0 端点包括令牌端点,该端点用于处理客户端凭证和托管登录授权码请求。服务端点应答用户池 API 请求,例如 InitiateAuth 和 RespondToAuthChallenge。每种类型的请求都有自己的限制。有关 限制的更多信息,请参阅 Amazon Cognito 中的配额。
使用 Amazon API Gateway 缓存机器到机器访问令牌
借助 API Gateway 令牌缓存,您的应用程序可以横向缩减对大于 Amazon Cognito OAuth 端点的默认请求速率配额的事件的响应。
您可以缓存访问令牌,以便您的应用程序仅在缓存的令牌过期时才请求新的访问令牌。否则,您的缓存端点会从缓存中返回一个令牌。这会阻止对 Amazon Cognito API 端点的其他调用。当您使用 Amazon API Gateway 作为 令牌端点的代理时,您的 API 会响应大多数原本会计入您的请求配额的请求,从而避免由于速率限制而导致的请求失败。
以下基于 API Gateway 的解决方案提供了低延迟、低代码/无代码的令牌缓存实施。API Gateway API 在传输中加密,也可以选择静态加密。API Gateway 缓存非常适合 OAuth 2.0 客户端凭证授予
在此解决方案中,您在 API 中定义缓存,以便为您要在应用程序中请求的 OAuth 作用域和应用程序客户端的每种组合存储单独的访问令牌。当您的应用程序发出与缓存键匹配的请求时,您的 API 会使用 Amazon Cognito 向与缓存键匹配的第一个请求颁发的访问令牌进行响应。当您的缓存键持续时间到期时,API 会将请求转发到令牌端点并缓存新的访问令牌。
注意
您的缓存键持续时间必须短于应用程序客户端的访问令牌持续时间。
缓存键由请求正文中 scope 参数所指定的 OAuth 作用域与请求中的 Authorization 请求标头组合而成。Authorization 标头包含您的应用程序客户端 ID 和客户端密钥。您无需在应用程序中实施其他逻辑即可实施此解决方案。您只必须更新配置以更改用户池令牌端点的路径。
您还可以使用 ElastiCache(Redis OSS)实施令牌缓存。要使用 Amazon Identity and Access Management (IAM) 策略进行精细控制,请考虑 Amazon DynamoDB 缓存。
注意
在 API Gateway 中缓存需要支付额外费用。有关更多详细信息,请参阅定价。
使用 API Gateway 设置缓存代理
-
打开 API Gateway 控制台
,然后创建一个 REST API。 -
在 Resources(资源)中,创建一个 POST 方法。
-
选择 HTTP Integration type(集成类型)。
-
选择 Use HTTP proxy integration(使用 HTTP 代理集成)。
-
输入 Endpoint URL(端点 URL)
https://。<your user pool domain>/oauth2/token
-
-
在 Resources(资源)中,配置缓存键。
-
编辑 POST 方法的 Method request(方法请求)。
注意
此方法请求验证用于令牌请求中的
client_secret_basic授权,其中客户端密钥被编码在Authorization请求标头中。对于使用client_secret_post授权方式对 JSON 请求正文的验证,应创建一个数据模型,明确要求请求正文中必须包含 client_secret。在此模型中,您的请求验证程序应验证正文、查询字符串参数和标头。 -
配置请求验证程序方法以验证查询字符串参数和标头。有关请求验证的更多信息,请参阅 Amazon API Gateway 开发者指南中的请求验证。
-
将您的
scope参数和Authorization标头设置为缓存键。-
将一个查询字符串添加到 URL 查询字符串参数。输入
scope作为查询字符串的名称,然后选择必填项和缓存。 -
将一个标头添加到 HTTP 请求标头。输入
Authorization作为请求标头的名称,然后选择必填项和缓存。
-
-
-
在 Stages(阶段)中,配置缓存。
-
选择要修改的阶段,然后从阶段详细信息中选择编辑。
-
在其他设置下,对于缓存设置,开启配置 API 缓存选项。
-
选择 Cache capacity(缓存容量)。较高的缓存容量可以提高性能,但需要额外付费。
-
清除需要授权复选框。选择继续。
-
API Gateway 仅将缓存策略应用于阶段级别的 GET 方法。您必须对 POST 方法应用缓存策略覆盖。
展开您配置的阶段并选择
POST方法。要为该方法创建缓存设置,请选择创建覆盖。 -
激活启用方法缓存选项。
-
对于缓存生存时间(TTL),输入 3600 秒。选择保存。
-
-
在 Stages(阶段)中,注意 Invoke URL(调用 URL)。
-
更新您的应用程序,以将令牌请求发布到 API 的 Invoke URL(调用 URL)而不是用户池的
/oauth2/token端点。