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
相关产品推荐
相关产品推荐

