Ottenere il nome utente del pool di utenti cognito dall'identità del pool di identità cognito


10

Sto utilizzando i pool di utenti AWS Congito per la gestione degli account con un pool di identità Cognito che ha questo pool di utenti come provider di identità. Sto usando questo per controllare l'accesso a un'API tramite API Gateway che invia richieste a Lambda. My Lambda è implementato con Java 8 usando Micronaut. Tutto questo funziona bene.

Nella Lambda, sto ottenendo il nome da Principalin 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;
  }

Cosa sta tornando nel nome stringa dell'identità Cognito. Qualcosa come questo:

noi-est-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx

Vorrei registrare il login utente effettivo o almeno avere un modo per convertire l'identitàId al login quando necessario.

La chiamata API LookupDeveloperIdentity sembra essere il modo giusto per farlo, ma non riesco a farlo funzionare.

Tentativo di eseguire questa operazione con Java e 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;    
  }

genera un'eccezione

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: non hai accesso a questa identità (Servizio: CognitoIdentity, Codice stato: 400, ID richiesta: 64e36646-612b-4985-91d1-82aca770XXXX)

Il tentativo di eseguire questa operazione tramite l'interfaccia della riga di comando produce un risultato simile:

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

Si è verificato un errore (NotAuthorizedException) durante la chiamata dell'operazione LookupDeveloperIdentity: non hai accesso a questa identità

Mi sono assicurato che la politica IAM in atto dovesse essere in grado di gestirla e quando provo con un ruolo che non ha questa politica, ricevo un errore diverso

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

Quindi le domande si riducono a:

  • È questo il modo migliore per ottenere il nome utente del pool di utenti dall'ID del pool di identità?
    • Se lo è, cosa sto facendo in modo errato?
    • In caso contrario, qual è il modo migliore per farlo?

Potresti provare docs.aws.amazon.com/cognitoidentity/latest/APIReference/… che ha raccomandato l'approccio per operazioni di volume maggiore. 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 Per me sembra un'autorizzazione dell'utente, non un problema di ruolo IAM.
Jan Garaj,

Ho provato anche quello e ho ricevuto lo stesso messaggio di errore. Sono sicuro che sto usando le credenziali dell'account proprietario del pool di identità: altre operazioni nel pool funzionano correttamente. Essendo un permesso utente sembra ... strano ... ma in tal caso, mi piacerebbe sapere come ottenere un permesso utente per un server.
Prigioniero

Risposte:


6

Approccio alternativo

Per recuperare l'ID utente del pool di utenti dell'utente, è possibile recuperare in lambda:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Ciò restituirà una stringa che includerà l'ID utente del pool di utenti dell'utente e sarà simile a:

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

Dove us-east-1_aaaaaaaaa è l'id del pool di utenti e qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr è l'ID utente del pool di utenti. È quindi possibile dividere la stringa ed estrarre l'ID utente.

Nota che queste informazioni saranno diverse a seconda del provider di autenticazione che stai utilizzando.

Quindi, se è necessario il nome utente anziché l'ID utente, è possibile estrarlo direttamente dal pool utente ottenendo i dettagli appropriati per quello specifico ID utente.

Riferimento

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


Accettato (in ritardo, ma felice di aver ottenuto il rappresentante del bonus), anche se la documentazione in quella pagina dice: "Mentre il processo di seguito non è documentato" Vorrei che ci fosse un vero modo documentato per farlo.
Prigioniero
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.