API Gateway Authorizer не вызывается - PullRequest
0 голосов
/ 30 марта 2020

Я создал несколько лямбда-функций и развернул их с помощью SAM. Развертывание прошло успешно, но при попытке достичь конечных точек я всегда получаю

{ message: "Unauthorized" }

Даже я отправляю правильный токен на предъявителя с использованием заголовка Authentication. Затем, если я go отправлю авторизатору и запускаю тест, он проходит хорошо и генерирует журналы в CloudWatch, но когда я запускаю запрос от моего клиентского приложения или клиентского приложения REST к конечной точке, я получаю неавторизованное сообщение и проверяю CloudWatch , не выполняется функция авторизатора.

Кроме того, проверяя функцию авторизатора из конфигурации Lambda, я вижу, что в API Gateway Trigger есть ошибка, но не знаю, что это значит.

Я создал функцию авторизации, используя руководство, предоставленное AWS: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html#api -gateway-lambda-authorizer-lambda-function-create

Совместное использование конфигурации SAM

Resources:
 SomeAPI:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      TracingEnabled: true
      Auth:
        DefaultAuthorizer: MyLambdaTokenAuthorizer
        Authorizers:
          MyLambdaTokenAuthorizer:
            FunctionArn: !GetAtt AuthorizerFunction.Arn

  GetActivityStreamFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: get-activity-stream/ 
      Handler: index.handler
      Layers:
        - !Ref DepencenciesLayer
        - !Ref DatabaseLayer
      Events:
        GetActivityStream:
          Type: Api
          Properties:
            RestApiId: !Ref SomeAPI
            Path: /activity-stream
            Method: get

  ## Authorizer Function
  AuthorizerFunction:
    Type: AWS::Serverless::Function
    Properties:
      Layers:
        - !Ref DepencenciesLayer
      CodeUri: authorizer/ 
      Handler: index.handler

Что касается ответа, отправленного обратно авторизатором, он отправляет все параметры, запрошенные API-шлюзом

{
      principalId: decoded.sub,
      policyDocument: getPolicyDocument("Allow", params.methodArn),
      context: { scope: decoded.scope }
}

Время выполнения, которое я использую, составляет nodejs12.x, и вот некоторые скриншоты того, что я получаю с консоли AWS.

Testing the Authorizer

Checking the API endpoint config

Error showed on Lambda console

1 Ответ

0 голосов
/ 01 апреля 2020

После многих часов тестирования различных вещей, обнаруженных Inte rnet, у меня начались улучшения, когда я заметил, что документ политики был неправильным:

До

  const policyDocument = {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": effect,
        "Action": "execute-api:Invoke",
        "Resource": resource
      }
    ]
  };

После

  const policyDocument = {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": effect,
        "Action": [
          "execute-api:Invoke"
        ],
        "Resource": [
          resource
        ]
      }
    ]
  };

Где Action и Resource должны быть массивами. Также я установил для переменной resource значение '*' вместо event.methodArn, потому что при кэшировании полномочий кэшированная политика соответствует только первым достигнутым конечным точкам, в то время как последующие вызовы других конечных точек приводят к ошибке: user not authorized for the method requested.

Другое изменение было в template.yaml

Resources:
  SomeAPI:
    Type: AWS::Serverless::Api
      Auth:
        DefaultAuthorizer: MyLambdaTokenAuthorizer
        AddDefaultAuthorizerToCorsPreflight: false
        Authorizers:
          MyLambdaTokenAuthorizer:
            FunctionArn: !GetAtt AuthorizerFunction.Arn
            Identity:
              Header: Authorization
              ValidationExpression: Bearer.*

AddDefaultAuthorizerToCorsPreflight со значением false, что делает предварительные вызовы (OPTIONS) не подлежащими проверке, поскольку предварительные запросы выполняется браузером, в противном случае все вызовы с Axios также не будут выполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...