9

每当我尝试通过浏览器通过 POST 访问无服务器 lambda 函数时,我都会收到错误消息

对预检请求的响应未通过访问控制检查:请求的资源上不存在 >'Access-Control-Allow-Origin' 标头。

当它/GET工作正常时,我读过它是因为它没有发送飞行前请求。当我把它改成POST这个时,它就失败了。

我正在运行的命令:

sam local start-api

我的 template.yaml 是:

...

Resources:
    PropertiesFunction:
        Type: AWS::Serverless::Function
        Properties:
            CodeUri: target/service-0.0.1-SNAPSHOT.jar
            Handler: com.aws.PropertiesHandler::handleRequest
            Runtime: java8
            Events:
                PropertiesApi:
                    Type: Api
                    Properties:
                        Path: /properties
                        Method: post

...

如何在这些端点上启用 CORS?

4

4 回答 4

11

我有同样的错误,我已经通过 3 个步骤修复了它。(Java8 中的 AWS Lambda,SAM CLI v0.37.0)

  1. 为您的标题添加选项:
    Map<String, String> headers = new HashMap<>();
    headers.put("Content-Type", "application/json");
    headers.put("X-Custom-Header", "application/json");
    headers.put("Access-Control-Allow-Origin", "*");
    headers.put("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
    headers.put("Access-Control-Allow-Headers", "X-Requested-With,content-type");
  1. 将选项 Cors 添加到 template.yaml
    Globals:
      Function:
        Timeout: 20
      Api:
        Cors:
          AllowMethods: "'GET,POST,OPTIONS'"
          AllowHeaders: "'content-type'"
          AllowOrigin: "'*'"
          AllowCredentials: "'*'"
  1. 更新 template.yaml 中的属性资源函数
          Events:
            HelloWorld:
              Type: Api 
              Properties:
                # Path: /hello
                # Method: get
                Path: "/{proxy+}"
                Method: ANY
于 2020-01-17T06:44:25.137 回答
5

首先,您需要在 template.yml 中添加以下部分以在 API 网关中启用 cors:

Globals:
  Api:
    Cors:
      AllowMethods: "'GET,POST,OPTIONS'"
      AllowHeaders: "'content-type'"
      AllowOrigin: "'*'"
      AllowCredentials: "'*'"

然后在你的 lambda 函数响应中


        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Headers", requestContext.getHeaderString("Access-Control-Request-Headers"));
        headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,HEAD,OPTIONS");
于 2020-01-20T00:53:49.373 回答
4

您应该能够通过在处理程序函数中将以下标头显式添加到您的响应中来解决此问题以进行本地测试:

    "Access-Control-Allow-Origin": "*"

您可以使用仅在本地运行时添加标头的环境变量。

这是我拥有的处理程序函数的一个简单 Python 示例:

   if not all(field in values for field in required_fields):
    response = {
        'statusCode': 400,
        'body': json.dumps(
            {
                'message': 'Required data missing from request body'
            }
        )        
    }
    # explicitly add CORs headers for local testing
    response['headers'] = {"Access-Control-Allow-Origin": "*"}
    return response

这仅适用于本地测试,当您部署到 API 网关时,COR 由 API 网关上的配置处理。

这个解决方案对我有用,直到我还使用 Cognito 用户池向 API 添加了授权,我目前正在尝试解决这个问题。

这是关于该问题的类似帖子: How to Enable CORS for an AWS API Gateway Resource

这是官方 AWS 文档中对它的引用。

于 2018-11-20T21:09:16.337 回答
0

如果您使用 SAM,请在无服务器模板文件上尝试此操作

"Globals": {
    "Api": {
      "Cors": {
        "AllowMethods": "'POST, GET, PUT, DELETE'",
        "AllowHeaders": "'content-type'",
        "AllowOrigin": "'*'"
      }
    }
}
于 2021-08-31T14:39:19.963 回答