Предполетный ответ 403 запрещен. Как я могу разрешить метод параметров без x-api-ключа? - PullRequest
0 голосов
/ 28 марта 2020

Я использую SAM для создания своего API в облачной информации.

Я получаю 403 ЗАПРЕЩЕНО на мой метод опций (таким образом, также мой предварительный просмотр для моего метода get).

Как я могу позволить моему методу опций ответить 200 OK без моего x- api-key?

Я пробовал так много ответов на стеке, но ни один из них не подходит для моего формата шаблона SAM. Я перепробовал все разные комбинации моих AllowHeaders. Я пропустил ключ x-api - все тот же 403 ЗАПРЕЩЕНО.

Если я отправлю свой ключ x-api в почтальон с моей просьбой, я получу 200 OK, но в моем приложении reactjs по-прежнему выдает ту же ошибку, что и ниже, что мой предварительный просмотр не проходит.

Ответ журнала консоли на метод get enter image description here

Ответ почтальона на метод options ( предполетное тестирование) enter image description here

Ошибка Cloudwatch enter image description here

template.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

Лямбда-функция

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" })
        };
    }

1 Ответ

1 голос
/ 30 марта 2020

Хорошо, я нашел решение.

Я пропустил ту часть, где я должен сказать своему приложению SAM, что для метода параметров я должен указать, что мне не нужен ключ API. Я просто добавил следующее к каждому методу параметров:

Auth:
  ApiKeyRequired: 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
            Auth:
              ApiKeyRequired: false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...