Cors 飞行前响应403禁止。如果没有x-api-key,我如何允许选项方法?

Cors 飞行前响应403禁止。如果没有x-api-key,我如何允许选项方法?,cors,amazon-cloudformation,aws-api-gateway,preflight,sam,Cors,Amazon Cloudformation,Aws Api Gateway,Preflight,Sam,我正在使用SAM在cloudformation中创建API 我在我的options方法上得到了一个403禁忌(因此也是我的get方法的飞行前) 在没有x-api-key的情况下,如何允许我的options方法回复200 OK 我尝试了这么多的stackoverflow答案,但没有一个符合我的SAM模板格式。我已经尝试了所有不同的Alloweader组合。我已经输入了x-api-key,仍然是403禁止的 如果我将我的x-api-key和我的请求一起发送给postman,我会得到一个200 OK,

我正在使用SAM在cloudformation中创建API

我在我的options方法上得到了一个403禁忌(因此也是我的get方法的飞行前)

在没有x-api-key的情况下,如何允许我的options方法回复200 OK

我尝试了这么多的stackoverflow答案,但没有一个符合我的SAM模板格式。我已经尝试了所有不同的Alloweader组合。我已经输入了x-api-key,仍然是403禁止的

如果我将我的x-api-key和我的请求一起发送给postman,我会得到一个200 OK,但在我的reactjs应用程序中,它仍然会给出与下面相同的错误,我的飞行前没有通过

对get方法的控制台日志响应

邮递员对选项方法的回应(飞行前测试)

Cloudwatch错误

模板yaml

Globals:
  Function:
    Timeout: 10
  Api:
    Cors:
      AllowMethods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
      AllowHeaders: "'Content-Type,X-Amz-Date,X-Amz-Security-Token,x-api-key,Authorization,Origin,Host,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers'"
      AllowOrigin: "'*'"

Resources:
  BSApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        ApiKeyRequired: true
        AddDefaultAuthorizerToCorsPreflight: false

  GrondvogFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: grondvog/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Policies:
        - LambdaInvokePolicy: {
          'FunctionName': !Ref RDBQueryFunction
        }
      Environment:
        Variables:
          "RDBQueryFunctionName": !Ref RDBQueryFunction
      Events:
        KryGrondvog:
          Type: Api
          Properties:
            RestApiId: !Ref BSApi
            Path: /grondvog
            Method: get
        OptionsGrondvog:
          Type: Api
          Properties:
            RestApiId: !Ref BSApi
            Path: /grondvog
            Method: options
Lambda函数

if (event.httpMethod == 'OPTIONS') {
        rekords = {
            statusCode: 200,
            headers: {
                "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,X-Amz-Security-Token,x-api-key,Authorization,Origin,Host,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers",
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
                "X-Requested-With": "*"
            },
            body: JSON.stringify({ statusText: "OK" })
        };
    }

好的,我找到了解决办法

我错过了应该告诉我的SAM应用程序,对于options方法,我必须指定我不想要api密钥的部分。我刚刚在每个选项方法中添加了以下内容:

Auth:
  ApiKeyRequired: false

嘿,我遇到了同样的问题,我的选项请求需要API密钥。但是我并没有显式地声明我的选项,而是让AWS SAM添加它,因为在我的情况下,当用户发出选项请求时,我没有调用函数。你知道我如何允许API键不被调用吗required@SGolds你找到解决办法了吗?我也有同样的案子。我没有在sam模板中指定选项和方法,但是浏览器发出这些请求,并且响应为错误:x-amzn-errortype:MissingAuthenticationTokenExceptionHi,是的,我实际上从api资源中删除了身份验证,然后直接在需要密钥的GET路径上添加了身份验证。(您的设置可能不同,但我通过向lambda函数添加api事件来添加api资源,所以我只是向这些部分添加了auth,而不是api)
GrondvogFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: grondvog/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Policies:
        - LambdaInvokePolicy: {
          'FunctionName': !Ref RDBQueryFunction
        }
      Environment:
        Variables:
          "RDBQueryFunctionName": !Ref RDBQueryFunction
      Events:
        KryGrondvog:
          Type: Api
          Properties:
            RestApiId: !Ref BSApi
            Path: /grondvog
            Method: get
        OptionsGrondvog:
          Type: Api
          Properties:
            RestApiId: !Ref BSApi
            Path: /grondvog
            Method: options
            Auth:
              ApiKeyRequired: false