You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS API Gateway授权器中校验Cognito用户角色?

解决方案:Cognito + API Gateway 角色权限校验

核心前提:JWT签名的不可篡改性

首先明确:API Gateway通过Cognito用户池验证JWT时,会自动校验JWT的签名、有效期、issuer等信息。任何篡改JWT payload(包括cognito:groups字段)的行为都会导致签名验证失败,请求直接被API Gateway拦截,所以你无需担心黑客篡改cognito:groups后绕过验证——只要JWT能通过API Gateway的Cognito验证,payload里的字段就是可信的。

方案1:直接利用API Gateway的Cognito授权+请求校验规则

这是最轻量化的方案,无需额外Lambda:

  • 确保API Gateway的资源方法已配置Cognito用户池作为授权方,完成基础的JWT验证。
  • 在API Gateway的集成请求中添加「请求验证规则」:
    • 选择从JWT的cognito:groups字段提取值,判断是否包含你的管理员组名称(比如admin)。
    • 如果不包含,直接返回403 Forbidden。
  • 这种方式无需额外代码,性能最优,适合权限规则简单的场景。

方案2:自定义Lambda授权器(安全高效版)

如果需要更复杂的权限逻辑,用Lambda授权器时无需查询Cognito,只需先验证JWT合法性,再校验组字段:

  1. 在Lambda中,先使用AWS SDK或JWT库(比如jsonwebtoken)验证JWT的签名、有效期、issuer是否匹配你的Cognito用户池。
    • 可以通过Cognito的JWKS端点获取公钥来验证签名,避免硬编码密钥。
  2. 验证通过后,直接从JWT payload中读取cognito:groups字段,检查是否包含目标管理员组。
  3. 根据校验结果返回允许/拒绝的授权策略给API Gateway。
  • 优势:逻辑灵活,性能比查询Cognito好,且因为JWT已验证,组信息可信。

方案3:Lambda授权器+实时查询Cognito(强一致性场景)

如果你的业务要求权限必须是实时的(比如用户被移除管理员组后,立即失效,哪怕JWT还没过期),可以让Lambda授权器调用Cognito API查询用户当前的组:

  1. 给Lambda函数添加IAM权限:允许执行cognito-idp:AdminListGroupsForUser操作,目标为你的Cognito用户池。
  2. 在Lambda中,先验证JWT的合法性,提取用户的username或sub字段。
  3. 调用AdminListGroupsForUser API,获取用户当前所属的所有组。
  4. 检查返回的组列表中是否包含管理员组,再返回授权策略。
  • 注意:开启Lambda授权器的缓存功能,设置合理的缓存时间(比如5分钟),减少Cognito API调用次数,平衡实时性和性能。

关键注意事项

  • 无论用哪种方案,都必须确保JWT的合法性验证是第一步——只有通过签名、有效期等验证的JWT,其payload内容才可信。
  • 不要直接信任未验证的JWT字段,必须先完成基础验证。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:41:59