AWS HTTP API Gateway CORS与Cognito JWT授权共存配置问题
解决AWS HTTP API Gateway启用Cognito JWT授权后的CORS预检401问题
核心问题原因
浏览器发送的OPTIONS预检请求不会携带Authorization令牌,但你当前给所有路由(包括OPTIONS)都配置了Cognito JWT授权,导致API Gateway直接拒绝了OPTIONS请求,根本没机会返回你配置的CORS响应头,因此前端收到401错误。
解决方案步骤
1. 给OPTIONS路由单独配置无授权策略
必须让OPTIONS请求绕过Cognito授权,具体操作:
- 在HTTP API Gateway控制台中,找到对应路径的OPTIONS方法,将其授权类型设置为
NONE(其他GET/POST等方法保留Cognito JWT授权)。 - 如果用SAM/CloudFormation配置,需单独为OPTIONS路由指定
AuthorizationType: NONE,示例代码:Resources: MyHttpApi: Type: AWS::ApiGatewayV2::Api Properties: Name: MyHttpApi ProtocolType: HTTP CorsConfiguration: AllowMethods: ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"] AllowHeaders: ["*"] AllowOrigins: ["http://localhost:19006/"] AllowCredentials: true MaxAge: 600 # 单独配置OPTIONS路由的无授权策略 MyOptionsRoute: Type: AWS::ApiGatewayV2::Route Properties: ApiId: !Ref MyHttpApi RouteKey: "OPTIONS /{proxy+}" AuthorizationType: NONE Target: !Join ['/', ['integrations', !Ref MyLambdaIntegration]] # 其他业务路由保留Cognito JWT授权 MyGetRoute: Type: AWS::ApiGatewayV2::Route Properties: ApiId: !Ref MyHttpApi RouteKey: "GET /{proxy+}" AuthorizationType: JWT AuthorizerId: !Ref MyCognitoAuthorizer Target: !Join ['/', ['integrations', !Ref MyLambdaIntegration]]
2. 简化冗余的CORS配置
你的allowHeaders和exposeHeaders同时包含*和具体头,*已覆盖所有情况,简化后更清晰:
x-amazon-apigateway-cors: allowMethods: - "DELETE" - "GET" - "HEAD" - "OPTIONS" - "PATCH" - "POST" - "PUT" allowHeaders: - "*" exposeHeaders: - "*" maxAge: 600 allowCredentials: true allowOrigins: - "http://localhost:19006/"
3. 验证前端请求配置
fetch中的mode: 'cors'是默认值,可不用显式声明;- 确认
content-type与API预期一致,若API接受JSON,建议改为application/json(非简单请求都会触发预检,此调整不影响CORS解决,但能保证请求合法性)。
内容的提问来源于stack exchange,提问作者geo10
相关产品推荐
相关产品推荐

