web-dev-qa-db-fra.com

Lorsque j'essaie de me connecter à l'aide d'AWS Cognito, j'obtiens une AccessDeniedException concernant mon déclencheur Lambda personnalisé

J'appelle adminInitiateAuth et récupère une étrange AccessDeniedException pour mes propres lambdas.

Voici le code que j'appelle:

      var params = {
        AuthFlow: "ADMIN_NO_SRP_AUTH",
        ClientId: "@cognito_client_id@",
        UserPoolId: "@cognito_pool_id@",
        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));
        }
      });

Le message d'erreur que je reçois est:

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.

Est-ce que quelqu'un sait pourquoi j'obtiens cette erreur?

23
Ryan Shillington

Cela se produisait parce que j'avais recréé mon API Gateway & Lambdas (en utilisant sans serveur) et il se trouve que la console Cognito ajoute sournois des autorisations pour contacter une fonction Lambda donnée lorsqu'elle est ajoutée comme déclencheur via la console.


Pour résoudre ce problème dans votre fichier 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/", "@cognito_pool_id@" ] ]

Pour résoudre ce problème dans la console AWS :

  • Accédez à la console Cognito
  • Choisissez votre groupe d'utilisateurs
  • Allez dans "Déclencheurs"
  • Supprimez votre déclencheur personnalisé (définissez-le sur Aucun) et cliquez sur "Enregistrer"
  • Maintenant, réinitialisez-le et cliquez à nouveau sur "Enregistrer"

Voici n article intéressant du forum Amazon qui m'a conduit sur la bonne voie.

40
Ryan Shillington

J'ai eu un problème similaire au vôtre, sauf que j'essayais de configurer Lambda avec mon pool d'utilisateurs Cognito via CloudFormation.

Dans le lien que Ryan avait posté, il y avait un exemple de code que quelqu'un avait posté. À savoir Cognito avait besoin des autorisations appropriées pour appeler la fonction lambda.

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

vous pouvez ajouter l'autorisation du rôle lambda (créer une stratégie pour cognito et l'ajouter au rôle lamda). cela résout mon problème quand je suis resté dedans

0
satej sarker

lors de la création de la pile de cloudformation - j'ai eu une erreur comme

User:arn:aws::12345678:user/xyz is not authorized to perform:
cognito-idp:CreateUserPool on resource:*(Service:AWSCognitoIdentityProviderService;
Status Code: 400; Error Code: AccessDeniedException;Request ID: xxxxx)

solution de contournement :

  • est passé à la pile qui est dans l'état Rollback -> événements vérifiés et pouvait voir, (création échouée) certains rôles auxquels je n'ai pas accès,
  • J'ai donc vérifié la stratégie IAM qui m'a été attribuée - je n'avais pas accès.
  • J'ai créé une nouvelle stratégie et je me suis assigné en tant que stratégie en ligne en l'important depuis AWS.

    aws-cognito-idp

    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Cognito-IDP",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "cognito-idp:*"
            ],
            "Resource": "*"
        }
    ]
}

remarque: vous pouvez restreindre l'accès aux ressources et aux utilisateurs cognito-idp.

avec cela - je suis en mesure de créer et de déployer avec succès la pile cloudformation pour le module.

0
DHEERAJ