如何在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。
- 选择从JWT的
- 这种方式无需额外代码,性能最优,适合权限规则简单的场景。
方案2:自定义Lambda授权器(安全高效版)
如果需要更复杂的权限逻辑,用Lambda授权器时无需查询Cognito,只需先验证JWT合法性,再校验组字段:
- 在Lambda中,先使用AWS SDK或JWT库(比如
jsonwebtoken)验证JWT的签名、有效期、issuer是否匹配你的Cognito用户池。- 可以通过Cognito的JWKS端点获取公钥来验证签名,避免硬编码密钥。
- 验证通过后,直接从JWT payload中读取
cognito:groups字段,检查是否包含目标管理员组。 - 根据校验结果返回允许/拒绝的授权策略给API Gateway。
- 优势:逻辑灵活,性能比查询Cognito好,且因为JWT已验证,组信息可信。
方案3:Lambda授权器+实时查询Cognito(强一致性场景)
如果你的业务要求权限必须是实时的(比如用户被移除管理员组后,立即失效,哪怕JWT还没过期),可以让Lambda授权器调用Cognito API查询用户当前的组:
- 给Lambda函数添加IAM权限:允许执行
cognito-idp:AdminListGroupsForUser操作,目标为你的Cognito用户池。 - 在Lambda中,先验证JWT的合法性,提取用户的
username或sub字段。 - 调用
AdminListGroupsForUserAPI,获取用户当前所属的所有组。 - 检查返回的组列表中是否包含管理员组,再返回授权策略。
- 注意:开启Lambda授权器的缓存功能,设置合理的缓存时间(比如5分钟),减少Cognito API调用次数,平衡实时性和性能。
关键注意事项
- 无论用哪种方案,都必须确保JWT的合法性验证是第一步——只有通过签名、有效期等验证的JWT,其payload内容才可信。
- 不要直接信任未验证的JWT字段,必须先完成基础验证。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

