从S3上的静态站点进行POST时,AWS API Gateway端点会出现CORS错误

Mil*_*age 16 amazon-s3 cors aws-api-gateway

我创建了一个带有Serverless(serverless.com)的API端点,我通过API Gateway公开了它.虽然我已经启用了CORS,但我收到了以下错误

XMLHttpRequest无法加载 https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/development/signup.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许访问来源' http://yyyyyyyy.com.s3-website-us-east-1.amazonaws.com '.

端点的AWS API Gateway设置

尽管我已经设置了origin标题,但是当我使用Postman发出请求时,我没有收到任何错误.我该如何解决这个问题?

Jac*_*AWS 13

我们现在有一个错误,其中对API网关的失败请求将不包含适当的CORS标头,这会掩盖请求中的实际错误.

我将添加Ken所说的内容,并确保您已经使用Postman或其他非浏览器的客户端彻底测试了控制台中的API和资源,以及部署的版本.我希望API本身存在问题,并且您的CORS配置是正确的.

  • 我花了一个小时试图找出你的文档无法正常工作的原因,这实际上不是你文档的错,而是我之后没有部署API.你能考虑把它放在你的文件中:http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html (3认同)

Tia*_*opo 6

正如Jack Kohn所指出的,AWS控制台没有在非200响应上添加CORS标头,并且显然不允许您添加任何自定义标头.

通过导出到swagger并手动编辑文件(刚刚复制了200响应)并将其导回,我能够在失败的请求上启用CORS头.

答案应如下所示:

  responses:
    200:
      description: "200 response"
      schema:
        $ref: "#/definitions/Empty"
      headers:
        Access-Control-Allow-Origin:
          type: "string"
    401:
      description: "401 response"
      schema:
        $ref: "#/definitions/Empty"
      headers:
        Access-Control-Allow-Origin:
          type: "string"
  x-amazon-apigateway-integration:
    responses:
      default:
        statusCode: "200"
        responseParameters:
          method.response.header.Access-Control-Allow-Origin: "'*'"
        responseTemplates:
          application/json: "__passthrough__"
      Authentication Failed.*:
        statusCode: "401"
        responseParameters:
          method.response.header.Access-Control-Allow-Origin: "'*'"
        responseTemplates:
          application/json: "__passthrough__"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


小智 5

当“POST”到 API Gateway 时,我遇到了同样的问题。但我找到了解决问题的方法。

在为方法资源启用 CORS 后,并在添加必要的标头(例如 'Access-Control-Allow-Origin' = '*' 通配符后,它仍然失败。

转到您正在调用的资源的 OPTIONS,“GET”、“POST”等。单击该资源的“方法请求”窗格,设置 API Key = FALSE,不要将 API Key 设置为 true。这将导致 CORS 错误。

原因,OPTIONS在技术上不是方法,它是执行预检请求的浏览器功能,因此在预检期间浏览器不知道要发送什么API密钥,只有在响应返回给'Access -Control-Allow-Origin' = '*' 然后它将查找 HTTP 请求的代码以设置 X-Api-Key = 某个值的 setHeaders。

注意:invoke 方法本身、'POST' 等可以有 API Key = True,这完全没问题。

希望这能帮助那些像我一样挣扎了一段时间的人:)