Когда я пытаюсь войти в систему с помощью AWS Cognito, я получаю AccessDeniedException о моем настраиваемом триггере Lambda

Я звоню adminInitiateAuth и возвращая странное AccessDeniedException для своих собственных лямбдов.

Вот код, который я вызываю:

      var params = {
        AuthFlow: "ADMIN_NO_SRP_AUTH",
        ClientId: "@[email protected]",
        UserPoolId: "@[email protected]",
        AuthParameters: {
          USERNAME : username,
          PASSWORD : tempPassword
        },
      };
      cognitoIdentityServiceProvider.adminInitiateAuth(params, function(error, data) {
        if (error) {
          console.log("ERROR! Login failed: " + JSON.stringify(error), error.stack);
        } else {
          console.log("Login sent back: " + JSON.stringify(data));
        }
      });

Сообщение об ошибке, которое я получаю:

ERROR! Login failed: {"message":"arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.","code":"UnexpectedLambdaException","time":"2017-02-25T18:54:15.109Z","requestId":"ce42833f-fb8b-11e6-929b-2f78b63faa12","statusCode":400,"retryable":false,"retryDelay":1.0853444458916783} UnexpectedLambdaException: arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.

Кто-нибудь знает, почему я могу получить эту ошибку?

Ответ 1

Это происходило потому, что я заново создал свой API Gateway & Lambdas (используется без сервера), и оказывается, что консоль Cognito незаметно добавляет разрешения для связи с заданной функцией Lambda при добавлении в качестве триггера через консоль.


Чтобы исправить это в файле CloudFormation/serverless.yml:

resources:
  Resources:
    OnCognitoSignupPermission:
      Type: 'AWS::Lambda::Permission'
      Properties:
        Action: "lambda:InvokeFunction"
        FunctionName:
          Fn::GetAtt: [ "UsersUnderscoreonCognitoSignupLambdaFunction", "Arn"]
        Principal: "cognito-idp.amazonaws.com"
        SourceArn:
          Fn::Join: [ "", [ "arn:aws:cognito-idp", ":", Ref: "AWS::Region", ":", Ref: "AWS::AccountId", ":", "userpool/", "@[email protected]" ] ]

Чтобы исправить это в консоли AWS:

  • Перейти на консоль Cognito
  • Выберите свой пул пользователей
  • Перейти в "Триггеры"
  • Удалите пользовательский триггер (установите его на "Нет") и нажмите "Сохранить"
  • Теперь верните его обратно и снова нажмите "Сохранить"

Вот интересное сообщение на форуме Amazon, которое привело меня на правильный путь.

Ответ 2

У меня была проблема, похожая на вашу, за исключением того, что я пытался настроить Lambda с помощью моего пула пользователей Cognito через CloudFormation.

В ссылке, которую размещал Райан, был добавлен образец кода. Именно Cognito нуждался в надлежащих разрешениях для вызова функции лямбда.

MyLambdaInvocationPermission:
  Type: AWS::Lambda::Permission
  Properties:
    Action: lambda:InvokeFunction
    FunctionName: !GetAtt MyLambdaFunctionName.Arn
    Principal: cognito-idp.amazonaws.com
    SourceArn: !GetAtt MyCognitoUserPoolName.Arn

Ответ 3

Вы можете добавить разрешение от лямбда-роли (создайте политику для Cognito и добавьте к роли лямбда). это решило мою проблему, когда я застрял в ней