无服务器框架 AWS REST API Gateway - 403 CORS 错误

Posted

技术标签:

【中文标题】无服务器框架 AWS REST API Gateway - 403 CORS 错误【英文标题】:serverless framework AWS REST API Gateway - 403 CORS error 【发布时间】:2020-07-10 04:04:18 【问题描述】:

我正在尝试创建一个启用了 CORS 的函数。 该功能使用 Postman(存在 cors 标头)按预期工作,但从浏览器尝试时出现 CORS 错误(无 cors 标头)。

const getTicket = async event => 
    var ticketNumber = Date.now();
    return 
        headers: 
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
        ,
        statusCode: 200,
        body: JSON.stringify("ticketNumber": ticketNumber)
    ;
;
functions:
  getTicket:
    handler: code/common/ticket.getTicket
    runtime: nodejs12.x
    events:
      - http:
          method: get
          path: getTicket
          cors: true
          authorizer: 
            arn: $self:custom.auth0.authorizer_arn

我还尝试了其他几种编写 serverless.yaml 文件的方法,但它们都不起作用,它们之间的唯一区别是我的 API 网关中创建的方法。有时我有 GET+OPTIONS 方法,有时只有 GET,但从未使用过 CORS。

我得到错误: “从源 'http://localhost:8080' 访问 XMLHttpRequest 在 'https://...amazonaws.com/prod/getTicket' 已被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

【问题讨论】:

您是否在浏览器中启用了 CORS? 响应的 HTTP 状态码是什么?您可以使用浏览器开发工具中的网络窗格进行检查。是 4xx 还是 5xx 错误而不是 200 OK 成功响应? 403 代码。我不想在浏览器中激活 CORS,因为这样我就无法检测到类似的问题。 实际问题是 403,而不是 CORS。正如***.com/a/60926300/441757 的答案所指出的那样,默认情况下,5xx 和 4xx 将不存在 CORS 标头。如果您想让这些错误包含 CORS 标头,那么您可以执行该答案所描述的操作,然后浏览器将不再记录 CORS 消息。但是您仍然需要解决 403 问题。 你说得对,我有 2 个问题:Gareth McCumskey 的回答解决了 CORS 问题,以及我的 axios.get 请求中的另一个错误 :) 谢谢! 【参考方案1】:

您可能会看到服务器在到达您的返回语句之前返回错误。换句话说,API Gateway 返回 502 或 403(因为这些是最常见的错误),并且这些特定的返回默认情况下在 API Gateway 中不存在 CORS 标头。我建议使用 CloudWatch 检查特定的 Lambda 调用,以确定您的 Lambda 函数本身是否出错并进行纠正。

您还可以强制 API 网关返回所有响应的 CORS 标头。在 serverless.yml 文件的 resources 部分中,您可以执行以下操作并为其他状态代码添加任何其他条目:

resources:

  Resources:

    GatewayResponseDefault4XX:

      Type: 'AWS::ApiGateway::GatewayResponse'

      Properties:

        ResponseParameters:

          gatewayresponse.header.Access-Control-Allow-Origin: "'*'"

          gatewayresponse.header.Access-Control-Allow-Headers: "'*'"

        ResponseType: DEFAULT_4XX

        RestApiId:

          Ref: 'ApiGatewayRestApi'

【讨论】:

非常感谢! :)

以上是关于无服务器框架 AWS REST API Gateway - 403 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

带有无服务器框架的 AWS cognito

无服务器框架,API 网关 URL 何时更改?

无服务器框架+ AWS + Lambda + DynamoDB + GraphQL + Apollo Server =无法使POST请求工作

如何在 Cloudformation 中获取区域 AWS API 网关的自定义域的目标域名?

AWS 无服务器架构 – 为啥要使用 API 网关?

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)