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

配置CORS后Vue.js调用带Custom Authorizer的Api Gateway仍报跨域错误求助

解决带Custom Authorizer的API Gateway在Vue+Axios中的CORS问题

首先咱们理清核心差异:Postman调用正常但Vue的Axios请求失败,关键在于浏览器会自动发送预检OPTIONS请求,而Postman不会触发严格的预检流程。当API Gateway配置了Custom Authorizer时,如果OPTIONS请求被错误要求经过授权,就会因为它不带Authorization头而被拒绝,导致没有返回CORS所需的响应头,进而触发浏览器的CORS拦截。

以下是一步步排查和解决的方案:

1. 修正SAM模板的CORS配置格式

你当前的CORS配置里,AllowHeaders和AllowOrigin的值带了多余的单引号,这会导致API Gateway返回的响应头格式不符合规范:

Cors:
  AllowHeaders: "'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization'"
  AllowOrigin: "'*'"

正确配置应该去掉单引号,SAM会自动处理字符串包裹:

Cors:
  AllowHeaders: "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"
  AllowOrigin: "*"
  AllowMethods: "GET,OPTIONS" # 明确指定允许的方法,避免默认值遗漏

2. 确保OPTIONS请求不经过Custom Authorizer

Custom Authorizer默认会应用到API的所有方法上,但OPTIONS预检请求不需要授权。你需要在SAM模板中,为OPTIONS方法单独配置跳过授权:

假设你的API资源和方法定义如下,重点标记了OPTIONS的配置:

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Cors:
        AllowHeaders: "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"
        AllowOrigin: "*"
        AllowMethods: "GET,OPTIONS"
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.lambdaHandler
      Events:
        GetRequest:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /my-resource
            Method: get
            Auth:
              Authorizer: MyCustomAuthorizer # 仅对GET方法应用授权
        OptionsRequest:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /my-resource
            Method: options
            # 这里不配置Auth,让API Gateway直接处理OPTIONS请求
  MyCustomAuthorizer:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: authorizer/
      Handler: authorizer.handler

这样配置后,OPTIONS请求会由API Gateway直接处理,返回正确的CORS头,不会触发Custom Authorizer的校验。

3. 规范Axios请求的头格式

你的Axios代码中authorization头是小写的:

const config = { headers: { authorization: jwt } }

虽然HTTP头不区分大小写,但部分Custom Authorizer可能会严格检查Authorization(首字母大写)的头字段,建议改成标准格式:

const config = { headers: { Authorization: jwt } }

4. 验证预检请求的响应

打开浏览器开发者工具的Network面板,查看OPTIONS请求的详情:

  • 确认请求状态码为200
  • 确认响应头包含Access-Control-Allow-Origin: *、Access-Control-Allow-Headers包含Authorization等字段
  • 如果OPTIONS请求返回401/403,说明Custom Authorizer被错误触发,需要回到步骤2调整配置

按照以上步骤调整后,Vue应用的Axios请求应该就能正常通过CORS验证了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:37:30