调用AWS Cognito保护的API端点返回401未授权问题
Cognito + API Gateway 返回401问题排查与修复
你遇到的「控制台授权器测试token有效、实际调用返回401」是Cognito集成API Gateway的典型问题,核心原因是控制台测试逻辑和实际API请求的校验规则存在差异,按以下优先级排查即可:
最高概率诱因:Authorization头格式不符合规范
API Gateway的Cognito用户池授权器对Authorization头的格式有严格要求:
- 鉴权前缀必须是大写开头的
Bearer,你当前代码里写的小写bearer会被直接判定为无效头,触发401。而控制台测试授权器时,输入框只需要传入纯token内容,不需要手动加前缀,所以不会触发这个格式校验,表现为测试通过、实际调用失败。 Bearer和token值之间只能保留1个半角空格,token前后不能拼接多余的空格、换行符。
修复方式:将请求头设置改为
headers: { "Authorization": `Bearer ${token.trim()}` }
次高概率诱因:Token类型与授权器配置不匹配
你当前代码中取的是ID Token:result.getIdToken().getJwtToken(),需要核对API Gateway侧Cognito授权器的配置:
- 如果授权器开启了「仅校验访问令牌(Access Token)」的配置,合法的ID Token也会被拒绝
- 控制台测试时不会校验你配置的令牌类型限制,只要是该用户池签发的合法JWT(签名、有效期、受众匹配)就会返回200,和实际请求的校验逻辑不一致
修复方式:
- 如果授权器要求Access Token,将取token的逻辑改为
result.getAccessToken().getJwtToken() - 如果授权器配置为接受ID Token,保持现有取token逻辑即可,不要混用两类token
其他常见排查点
- 检查
aws-api-gateway-client是否覆写了Authorization头:如果初始化客户端时传入了AK/SK等SigV4签名参数,客户端会自动生成签名格式的Authorization头(以AWS4-HMAC-SHA256开头),覆盖你手动设置的Bearer token。可以打印实际发出的请求头确认最终值,不需要SigV4签名的话初始化时不要传入签名相关参数即可。 - 检查跨域预检请求配置:如果是跨域调用,浏览器会先发送OPTIONS预检请求,若OPTIONS方法绑定了Cognito授权器,预检请求不会携带Authorization头,会直接返回401,导致后续实际请求被浏览器拦截。需要给OPTIONS方法设置为「无认证」,同时正确配置CORS响应头,允许
Authorization头被跨域携带。
内容的提问来源于stack exchange,提问作者DocCaliban
相关产品推荐
相关产品推荐

