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

API Gateway代理集成传access_token报Unauthorized id_token可正常使用

问题根因

Cognito用户池类型的API Gateway授权器,对access_token和id_token的校验规则存在差异,你当前的配置只满足id_token的校验要求:

  • id_token的aud(受众)字段值为Cognito应用客户端ID,在仅配置用户池ARN、未显式配置授权范围的场景下,会被授权器判定为合法
  • access_token的校验依赖显式配置的OAuth授权范围,未配置对应范围时,授权器会直接拒绝access_token请求,返回401 Unauthorized
修复方案

按以下步骤调整配置即可让access_token正常通过鉴权:

  1. 核对Cognito应用客户端的OAuth范围配置
    进入Cognito用户池控制台,找到当前业务使用的应用客户端,确认「允许的OAuth范围」中已经勾选了业务需要用到的范围,包括基础的openid、profile等系统范围,以及你在资源服务器下配置的自定义业务范围。
  2. 给API方法补充授权范围配置
    你当前的Authorizer资源仅关联了Cognito用户池ARN,没有给绑定该授权器的API方法配置AuthorizationScopes属性,这是导致access_token被拦截的核心原因。补充配置参考如下:
# 对应API方法的CloudFormation配置示例
YourApiMethod:
  Type: AWS::ApiGateway::Method
  Properties:
    RestApiId: ${file(./config/${self:provider.stage}.yml):${self:provider.region}.deploymentRestApiId}
    ResourceId: !Ref YourTargetResource
    HttpMethod: ANY # 替换为你实际的请求方法
    AuthorizationType: COGNITO_USER_POOLS
    AuthorizerId: !Ref ApiGatewayAuthorizer
    # 关键配置:填入第一步中Cognito客户端允许的OAuth范围
    AuthorizationScopes:
      - openid
      - email
      # 自定义scope格式为 <资源服务器标识符>/<scope名称>,例如 https://api.yourdomain.com/user.read
    Integration:
      Type: AWS_PROXY
      IntegrationHttpMethod: POST
      Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambdaFunction.Arn}/invocations

注意:如果不在API方法上显式配置AuthorizationScopes,Cognito授权器默认仅接受id_token,会直接拦截所有携带access_token的请求。

  1. 核对取token时的请求参数
    调用Cognito /oauth2/token 端点获取access_token时,请求体中的scope参数必须传入你在上一步配置的、Cognito客户端已允许的范围值,参数错传、漏传都会导致拿到的access_token无法通过授权器校验。
相关配置参考截图

Authorizer配置截图
OAuth配置截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:45:44