Uzyskiwanie nazwy użytkownika puli użytkowników cognito z identyfikatora puli tożsamości cognito

10

Korzystam z pul użytkowników AWS Congito do zarządzania kontami z pulą tożsamości Cognito, która ma tę pulę użytkowników jako dostawcę tożsamości. Używam tego do kontrolowania dostępu do API poprzez API Gateway, który wysyła żądania do Lambda. My Lambda jest implementowana w Javie 8 za pomocą Micronaut. Wszystko działa dobrze.

W Lambda, Dostaję nazwę od Principalw 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;
  }

Co wraca w nazwie ciągu Cognito Identyfikator tożsamości. Coś takiego:

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

Chciałbym albo zalogować rzeczywisty login użytkownika, albo przynajmniej w jakiś sposób przekonwertować identyfikator tożsamości na login, gdy zajdzie taka potrzeba.

LookupDeveloperIdentity wywołanie API wydaje się być dobrym sposobem, aby przejść na ten temat, ale jestem w stanie zmusić go do pracy.

Próba zrobienia tego w Javie i 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;    
  }

zgłasza wyjątek

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: Nie masz dostępu do tej tożsamości (usługa: CognitoIdentity, kod statusu: 400, identyfikator żądania: 64e36646-612b-4985-91d1-82aca770XXXX)

Próba zrobienia tego za pośrednictwem interfejsu CLI daje podobny wynik:

aws cognito-tożsamości 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

Wystąpił błąd (NotAuthorizedException) podczas wywoływania operacji LookupDeveloperIdentity: Nie masz dostępu do tej tożsamości

Upewniłem się, że obowiązująca polityka IAM powinna być w stanie sobie z tym poradzić, a gdy spróbuję z rolą, która nie ma tej zasady, pojawia się inny błąd

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

Pytania sprowadzają się więc do:

  • Czy to najlepszy sposób na uzyskanie nazwy użytkownika puli użytkowników z identyfikatora puli tożsamości?
    • Jeśli tak - co robię niepoprawnie?
    • Jeśli tak nie jest - jaki jest lepszy sposób?
Więzień
źródło
Czy możesz wypróbować docs.aws.amazon.com/cognitoidentity/latest/APIReference/..., które zalecają podejście do operacji o większym wolumenie. 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 Dla mnie wygląda to na pozwolenie użytkownika, a nie problem roli IAM.
Jan Garaj
Próbowałem tego również i otrzymałem ten sam komunikat o błędzie. Jestem pewien, że używam poświadczeń z konta, które jest właścicielem puli tożsamości - inne operacje na puli działają dobrze. To, że jest to uprawnienie użytkownika, wydaje się ... dziwne ... ale jeśli tak, chciałbym wiedzieć, jak uzyskać pozwolenie użytkownika na serwer.
Więzień

Odpowiedzi:

6

Alternatywne podejście

Aby pobrać identyfikator użytkownika puli użytkowników, możesz pobrać w lambda:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Zwróci ciąg zawierający identyfikator użytkownika puli użytkowników i będzie wyglądał mniej więcej tak:

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

Gdzie us-east-1_aaaaaaaaa jest identyfikatorem puli użytkowników, a qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr jest identyfikatorem użytkownika puli użytkowników. Następnie możesz podzielić ciąg i wyodrębnić identyfikator użytkownika.

Pamiętaj, że informacje te będą się różnić w zależności od używanego dostawcy uwierzytelnienia.

Następnie, jeśli potrzebujesz nazwy użytkownika zamiast identyfikatora użytkownika, możesz wyodrębnić go bezpośrednio z puli użytkownika, uzyskując odpowiednie szczegóły dla tego konkretnego identyfikatora użytkownika.

Odniesienie

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

Xanthos Symeou
źródło
Zaakceptowano (z opóźnieniem, ale cieszę się, że dostałeś dodatkowe powtórzenie), nawet mimo tego, że dokumentacja na tej stronie mówi: „Podczas gdy poniższy proces nie jest udokumentowany” Żałuję, że nie ma rzeczywistego udokumentowanego sposobu, aby to zrobić.
Więzień