Obtention du nom d'utilisateur du pool d'utilisateurs de cognito à partir de l'identité du pool d'identités de cognito

10

J'utilise les pools d'utilisateurs AWS Congito pour la gestion des comptes avec un pool d'identités Cognito qui a ce pool d'utilisateurs comme fournisseur d'identité. J'utilise cela pour contrôler l'accès à une API via API Gateway qui envoie des demandes à Lambda. My Lambda est implémenté avec Java 8 à l'aide de Micronaut. Tout cela fonctionne bien.

Dans la Lambda, je reçois le nom de la Principaldans HttpRequest:

  protected String resolveUser( HttpRequest request ){
    String ret = null;

    Optional<Principal> principal = request.getUserPrincipal();
    if( principal.isPresent() ){
      ret = principal.get().getName();
    }

    if( ret == null || ret.length() == 0 ){
      ret = "unknown";
    }
    return ret;
  }

Ce qui revient dans le nom de chaîne du Cognito identityId. Quelque chose comme ça:

us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx

Je voudrais soit enregistrer la connexion utilisateur réelle, soit au moins avoir un moyen de convertir l'ID d'identité en connexion lorsque cela est nécessaire.

L' appel de l' API LookupDeveloperIdentity semble être la bonne façon de procéder, mais je ne parviens pas à le faire fonctionner.

Tenter de le faire avec Java et le kit AWS Java SDK 2:

  protected String loadUsername( String user ){
    String ret = "unknown:"+user;
    CognitoIdentityClient cognito = CognitoIdentityClient.create();

    LookupDeveloperIdentityRequest request = LookupDeveloperIdentityRequest.builder()
      .identityPoolId( identityPoolId )
      .identityId( user )
      .build();
    LookupDeveloperIdentityResponse response = cognito.lookupDeveloperIdentity( request );
    List<String> identifiers = response.developerUserIdentifierList();
    if( identifiers != null && identifiers.size() > 0 ){
      ret = identifiers.get( 0 );
    }

    return ret;    
  }

lève une exception

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: Vous n'avez pas accès à cette identité (Service: CognitoIdentity, Code d'état: 400, ID de demande: 64e36646-612b-4985-91d1-82aca770XXXX)

Tenter de le faire via la CLI produit un résultat similaire:

aws cognito-identity lookup-developer-identity --identity-id us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-east-1: xxxx0aa1-89f9-4418-be04- 7e83c838xxxx --max-results = 10

Une erreur s'est produite (NotAuthorizedException) lors de l'appel de l'opération LookupDeveloperIdentity: vous n'avez pas accès à cette identité

Je me suis assuré que la stratégie IAM en place devrait être en mesure de gérer cela, et lorsque je l'essaie avec un rôle qui n'a pas cette stratégie, j'obtiens une erreur différente

    {
        "Effect": "Allow",
        "Action": [
            "cognito-identity:LookupDeveloperIdentity"
        ],
        "Resource": [
            "arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
        ]
    }

Les questions se résument donc à:

  • Est-ce la meilleure façon d'obtenir le nom d'utilisateur du pool d'utilisateurs à partir de l'ID du pool d'identités?
    • Si c'est le cas - qu'est-ce que je fais mal?
    • Si ce n'est pas le cas - quelle est la meilleure façon de procéder?
Prisonnier
la source
Pourriez-vous essayer docs.aws.amazon.com/cognitoidentity/latest/APIReference/… qui a recommandé l'approche pour les opérations à volume élevé. Are you sure you are using the credentials from the account which owns the identity pool you are requesting lookupDeveloperIdentity for?- forums.aws.amazon.com/thread.jspa?threadID=231354 Pour moi, cela ressemble à une autorisation utilisateur, pas à un problème de rôle IAM.
Jan Garaj
J'ai également essayé cela et j'ai reçu le même message d'erreur. Je suis sûr que j'utilise les informations d'identification du compte propriétaire du pool d'identités - les autres opérations sur le pool fonctionnent correctement. Cela étant une autorisation utilisateur semble ... étrange ... mais si c'est le cas, j'aimerais savoir comment obtenir une autorisation utilisateur pour un serveur.
Prisonnier le

Réponses:

6

Approche alternative

Afin de récupérer l'ID utilisateur du groupe d'utilisateurs de l'utilisateur, vous pouvez récupérer dans votre lambda:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Cela renverra une chaîne qui inclura l'ID utilisateur du groupe d'utilisateurs et ressemblera à quelque chose comme:

cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr

Où us-east-1_aaaaaaaaaa est l'ID du pool d'utilisateurs et qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr est l'ID utilisateur du pool d'utilisateurs. Vous pouvez ensuite diviser la chaîne et extraire l'ID utilisateur.

Notez que ces informations seront différentes selon le fournisseur d'authentification que vous utilisez.

Ensuite, si vous avez besoin du nom d'utilisateur au lieu de l'ID utilisateur, vous pouvez l'extraire directement du pool d'utilisateurs en obtenant les détails appropriés pour cet ID utilisateur spécifique.

Référence

https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html

Xanthos Symeou
la source
Accepté (tardivement, mais content que vous ayez reçu le représentant bonus), même si la documentation sur cette page dit: "Bien que le processus ci-dessous ne soit pas documenté" J'aimerais qu'il y ait une manière documentée de le faire.
Prisonnier le