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正常通过鉴权:
- 核对Cognito应用客户端的OAuth范围配置
进入Cognito用户池控制台,找到当前业务使用的应用客户端,确认「允许的OAuth范围」中已经勾选了业务需要用到的范围,包括基础的openid、profile等系统范围,以及你在资源服务器下配置的自定义业务范围。 - 给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的请求。
- 核对取token时的请求参数
调用Cognito/oauth2/token端点获取access_token时,请求体中的scope参数必须传入你在上一步配置的、Cognito客户端已允许的范围值,参数错传、漏传都会导致拿到的access_token无法通过授权器校验。
相关配置参考截图


内容的提问来源于stack exchange,提问作者Hulubina
相关产品推荐
相关产品推荐

