首页 > 解决方案 > 在 SAM 声明中如何防止 APIGateway 的 CORS 覆盖?

问题描述

我想使用 lambda 处理 CORS OPTIONS 请求,以便允许多个来源。这是我的 APIGateway SAM 声明的起点:

  TESTAPI:
    Type: AWS::Serverless::Api
    Properties:
      Name: TEST_API
      Cors:
        AllowOrigin: "'https://example.com'"  # only one origin allowed
        AllowCredentials: true
        AllowMethods: "'*'"
        AllowHeaders: "'*'"
      Auth:
        Authorizers:
          MyAuthorizer:
            UserPoolArn: arn:aws:cognito-idp:... # my user pool

为了简单起见,每个 lambda 都被声明为处理任何请求,如下所示:

  TESTEndpoint:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: TEST_endpoint
      Handler: package/module.handler_any
      Events:
        HttpAny:
          Type: Api
          Properties:
            Path: '/path/endpoint'
            Method: ANY
            RestApiId: !Ref TESTAPI
            Auth:
              Authorizer: MyAuthorizer

当我使用 curl 从端点请求 OPTIONS 时,将调用处理 lambda。

但是,当我实际发出跨源请求时,上面声明的 CORS 标头用于 OPTIONS 响应,而不是我的 lambda 返回的标头。同样,如果我不声明 CORS 标头,则 OPTIONS 响应中不会返回 CORS 标头,因此请求失败。

问题:如何防止 APIGateway 覆盖我的 CORS 标头?


更新 2021-7-27

这个问题仅与 OPTIONS 方法有关。对于所有其他方法(例如 GET),标头包含在 Lambda 定义的范围内,因此允许 CORS 用于多个来源。

标签: aws-api-gatewayaws-sam

解决方案


推荐阅读