理解API Gateway授权缓存(REST)
文章目录
当使用 API 的资源和方法,存在一些常见的误解。本文将详细解析这些问题,并提供最佳实践。
设置 Lambda 授权器缓存
在 API 网关中,有两种类型的自定义授权器:
- TOKEN 授权器:这是最简单的选项,通常通过
Authorization标头传递一个不记名的 JWT 令牌来验证请求。 - REQUEST 授权器:通过组合标头、查询字符串、
stageVariables和$context变量来接收调用者的身份信息。相比 TOKEN 授权器,这种方式可以传递更多关于请求的信息到 Lambda 函数。
以下是控制台中这两种授权器的对比截图:
API 网关 Lambda 授权器对比
无论是 TOKEN 授权器还是 REQUEST 授权器,都可以选择启用授权缓存,其 TTL(生存时间)范围为 0 到 3600 秒(60 分钟)。需要注意的是,3600 秒是硬性限制,无法增加。
缓存的密钥由定义的令牌源或身份源决定。
缓存中存储了什么?
缓存中存储的是 Lambda 授权器函数的输出结果,其中包括用于决定是否允许或拒绝调用者的 policyDocument。例如,以下输出会拒绝对账户 123456789012 的 API 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 语句。然而,由于缓存会应用于整个阶段,因此后续调用不同资源或方法时,可能会返回错误的策略,导致隐式拒绝。例如:
- 用户调用
https://myapi.com/prod/pets/cats,生成的策略允许访问/pets/cats并存储在缓存中。 - 用户调用
https://myapi.com/prod/pets/dogs,由于缓存的策略未包含/pets/dogs,用户被隐式拒绝。
如果禁用缓存,Lambda 授权器会在每次调用时动态生成策略,从而避免上述问题。
正确处理缓存的两种方法
为了正确处理缓存,可以采用以下两种方法:
-
在
policyDocument中包含 API 阶段的所有资源和方法这种方法可以通过使用通配符(如
*)来实现。例如,允许访问所有资源和方法。 -
在标识源中包含
$context变量配置标识源时,将
httpMethod和resourcePath添加到$context中。这样可以为每个方法和资源创建独立的缓存键。
关于 $context 缓存键的更多信息
基于 REQUEST 授权器,可以向身份源添加 $context 变量。这允许将 httpMethod 和 resourcePath 用作缓存键的一部分,从而为每个方法和资源创建独立的缓存。例如:
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 内调用的所有资源和方法。
解决方案
-
明确列出所有允许/拒绝的操作
这种方法安全性较高,但逻辑复杂,可能会受到 8KB 策略大小限制的影响。
-
使用通配符
在策略声明中使用通配符(如
*),可以简化逻辑。然而,这种方法的安全性较低,可能会导致无意中允许访问新增的资源。
有关 API 调用策略的详细信息,请参考 API 网关中执行 API 的 IAM 策略语句参考。
通过本文的解析,相信您已经对 API 网关授权缓存的工作原理、常见误区以及最佳实践有了清晰的认识。正确配置缓存不仅可以提升性能,还能避免潜在的安全问题。
原文链接: https://tmmr.uk/post/api-gateway/api-gateway-auth-caching/
最新文章
- 强力监控!Spring Boot 3.3 集成 Zipkin 全面追踪 RESTful API 性能
- API安全:内部审计师快速参考指南
- 什么是 REST API?
- GitLab的API调用指南
- 全球支付api解析:运作原理与使用指南
- 创建RESTful且开发者友好的API指南
- 最佳免费API用于教育应用集成
- Uber Ride API 开发指南:实现价格估算、路径调度与司机管理系统
- 用 Poe-API-wrapper 连接 DALLE、ChatGPT,批量完成AI绘图或文字创作
- RESTful Web API 设计中要避免的 6 个常见错误
- LangGraph 工具详解:构建 AI 多步骤流程的关键利器
- GitHubAPI调用频率限制的增加方法