理解API Gateway授权缓存(REST)

作者:API传播员 · 2026-01-09 · 阅读时间:5分钟

当使用 API 的资源和方法,存在一些常见的误解。本文将详细解析这些问题,并提供最佳实践。


设置 Lambda 授权器缓存

在 API 网关中,有两种类型的自定义授权器:

  1. TOKEN 授权器:这是最简单的选项,通常通过 Authorization 标头传递一个不记名的 JWT 令牌来验证请求。
  2. REQUEST 授权器:通过组合标头、查询字符串、stageVariables$context 变量来接收调用者的身份信息。相比 TOKEN 授权器,这种方式可以传递更多关于请求的信息到 Lambda 函数。

以下是控制台中这两种授权器的对比截图:

API 网关 Lambda 授权器对比

无论是 TOKEN 授权器还是 REQUEST 授权器,都可以选择启用授权缓存,其 TTL(生存时间)范围为 0 到 3600 秒(60 分钟)。需要注意的是,3600 秒是硬性限制,无法增加。

缓存的密钥由定义的令牌源或身份源决定。


缓存中存储了什么?

缓存中存储的是 Lambda 授权器函数的输出结果,其中包括用于决定是否允许或拒绝调用者的 policyDocument。例如,以下输出会拒绝对账户 123456789012API ymy8tbxw7b 的开发阶段中 GET 方法的调用。


缓存的作用范围

缓存的作用范围是每个 API 阶段,而不是按资源或方法进行缓存。这是一个常见的误解。例如,对于 prod 阶段,以下调用将返回相同的缓存授权器响应:

  • GET https://myapi.com/prod/pets/cats(触发 Lambda,生成策略并存储在缓存中)
  • GET https://myapi.com/prod/pets/cats(从缓存中返回策略)
  • GET https://myapi.com/prod/pets/dogs(从缓存中返回策略)
  • POST https://myapi.com/prod/pets/cats(从缓存中返回策略)

如果需要刷新整个 API 阶段的缓存,可以使用 FlushStageAuthorizersCache API。例如,通过 AWS CLI 执行以下命令:

aws apigateway flush-stage-authorizers-cache --rest-api-id 1234124 --stage-name dev

常见错误及其原因

开发者常犯的一个错误是仅返回当前调用的特定资源或方法的 allow 语句。然而,由于缓存会应用于整个阶段,因此后续调用不同资源或方法时,可能会返回错误的策略,导致隐式拒绝。例如:

  1. 用户调用 https://myapi.com/prod/pets/cats,生成的策略允许访问 /pets/cats 并存储在缓存中。
  2. 用户调用 https://myapi.com/prod/pets/dogs,由于缓存的策略未包含 /pets/dogs,用户被隐式拒绝。

如果禁用缓存,Lambda 授权器会在每次调用时动态生成策略,从而避免上述问题。


正确处理缓存的两种方法

为了正确处理缓存,可以采用以下两种方法:

  1. policyDocument 中包含 API 阶段的所有资源和方法

    这种方法可以通过使用通配符(如 *)来实现。例如,允许访问所有资源和方法。

  2. 在标识源中包含 $context 变量

    配置标识源时,将 httpMethodresourcePath 添加到 $context 中。这样可以为每个方法和资源创建独立的缓存键。


关于 $context 缓存键的更多信息

基于 REQUEST 授权器,可以向身份源添加 $context 变量。这允许将 httpMethodresourcePath 用作缓存键的一部分,从而为每个方法和资源创建独立的缓存。例如:

  • GET https://myapi.com/prod/pets/cats(触发 Lambda,生成策略并存储在缓存中)
  • GET https://myapi.com/prod/pets/cats(从缓存中返回策略)
  • GET https://myapi.com/prod/pets/dogs(触发 Lambda,生成策略并存储在缓存中)
  • POST https://myapi.com/prod/pets/cats(触发 Lambda,生成策略并存储在缓存中)

以下是相关截图:


TOKEN 授权器是否支持 $context 缓存键?

不支持。$context 缓存键方法仅适用于 REQUEST 授权器。如果使用的是 TOKEN 授权器,需要确保返回的 policyDocument 包含客户端可能在缓存 TTL 内调用的所有资源和方法。

解决方案

  1. 明确列出所有允许/拒绝的操作

    这种方法安全性较高,但逻辑复杂,可能会受到 8KB 策略大小限制的影响。

  2. 使用通配符

    在策略声明中使用通配符(如 *),可以简化逻辑。然而,这种方法的安全性较低,可能会导致无意中允许访问新增的资源。

有关 API 调用策略的详细信息,请参考 API 网关中执行 API 的 IAM 策略语句参考


通过本文的解析,相信您已经对 API 网关授权缓存的工作原理、常见误区以及最佳实践有了清晰的认识。正确配置缓存不仅可以提升性能,还能避免潜在的安全问题。

原文链接: https://tmmr.uk/post/api-gateway/api-gateway-auth-caching/