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

AWS API Gateway使用Cognito用户池授权器时AccessToken验证失败问题

解决API Gateway拒绝Cognito Access Token但接受ID Token的问题

我来帮你拆解这个问题,你遇到的核心矛盾是API Gateway用Cognito用户池授权器时,ID Token能通过验证但Access Token被401拒绝,结合你的配置,主要有几个关键点要排查:

1. 检查API Gateway授权器的令牌类型配置

这是最常见的原因!API Gateway的Cognito用户池授权器默认可能被设置为只验证ID Token,而非Access Token。你需要进入API Gateway控制台操作:

  • 找到你的Cognito授权器,点击进入编辑页面
  • 查看「Token Validation」部分的「Token Type」选项,确认是否选择了「Access Token」
  • 如果之前选的是ID Token,切换成Access Token后重新部署API,再进行测试

为什么会这样?因为ID Token的受众(aud字段)是你的客户端App ID,而Access Token的aud是Cognito用户池的ID,授权器的令牌类型决定了它会验证哪个字段与配置匹配。

2. 确认Cognito客户端和授权器的受众匹配

如果你已经设置授权器验证Access Token但仍返回401,那要检查Access Token的aud字段:

  • 用jwt.io解码你的Access Token,查看aud值(格式应为us-east-1_xxxxxxxxx这类用户池ID)
  • 确认API Gateway授权器关联的用户池ID和这个aud完全一致
  • 另外,检查令牌的iss字段是否为你的用户池域名(比如https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx),确保区域和API Gateway的区域匹配

3. 自定义范围的配置(若需要细粒度授权)

如果你的API需要基于范围做细粒度授权,那你需要补充以下配置:

步骤1:在Cognito用户池创建资源服务器

  • 进入Cognito控制台,打开你的用户池,转到「App integration」→「Resource servers」
  • 点击「Create resource server」,输入一个标识符(比如https://my-api.example.com)和名称,然后添加自定义范围(比如api/read、api/write)

步骤2:给客户端App分配范围权限

  • 转到用户池的「App clients and analytics」,找到你的客户端App,编辑它的「Allowed scopes」,把刚才创建的自定义范围添加进去

步骤3:在API Gateway授权器配置验证范围

  • 回到API Gateway的授权器编辑页面,在「Settings」的「Scopes」字段中输入你要验证的范围(比如api/read)
  • 这样,当你获取Access Token时,请求的范围要包含这些自定义范围(比如在/oauth2/authorize请求中加上scope=openid email api/read),API Gateway才会接受这个Access Token

4. 排除其他基础问题

  • 确认你的Access Token没有过期(解码后看exp字段,是Unix时间戳)
  • 检查API Gateway的API是否已经重新部署(修改授权器后必须部署才能生效)
  • 确认你调用API时,Access Token是放在Authorization头里,格式为Bearer <your-access-token>

总结一下,最优先排查的是授权器的令牌类型设置,这是绝大多数人遇到这个问题的原因。如果只是需要API Gateway验证用户身份,不需要细粒度范围,只要把令牌类型改成Access Token就能解决;如果需要范围控制,再按步骤配置自定义范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:24:47