Obtendo o nome de usuário do conjunto de usuários cognito a partir do conjunto de identidades cognito identityId

10

Estou usando os pools de usuários do AWS Congito para gerenciamento de contas com um pool de identidades do Cognito que possui esse pool de usuários como provedor de identidades. Estou usando isso para controlar o acesso a uma API por meio do API Gateway que envia solicitações ao Lambda. Meu Lambda é implementado com Java 8 usando o Micronaut. Tudo isso está funcionando bem.

No Lambda, estou recebendo o nome do Principalno 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;
  }

O que está retornando no nome da sequência do Cognito identityId. Algo assim:

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

Gostaria de registrar o logon de usuário real ou, pelo menos, ter alguma maneira de converter o identityId em logon quando necessário.

A chamada da API LookupDeveloperIdentity parece ser o caminho certo para fazer isso, mas não consigo fazê-la funcionar.

Tentativa de fazer isso com Java e o 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;    
  }

lança uma exceção

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: você não tem acesso a essa identidade (Serviço: CognitoIdentity, Código de status: 400, ID do pedido: 64e36646-612b-4985-91d1-82aca770XXXX)

Tentar fazer isso através da CLI produz um resultado semelhante:

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

Ocorreu um erro (NotAuthorizedException) ao chamar a operação LookupDeveloperIdentity: Você não tem acesso a essa identidade

Verifiquei se a política do IAM em vigor deve lidar com isso e quando tento com uma função que não possui essa política, recebo um erro diferente

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

Portanto, as perguntas se resumem a:

  • Essa é a melhor maneira de obter o nome de usuário do pool de usuários a partir do ID do pool de identidades?
    • Se estiver - o que estou fazendo incorretamente?
    • Se não for - qual é a melhor maneira de fazer isso?
Prisioneiro
fonte
Você pode tentar docs.aws.amazon.com/cognitoidentity/latest/APIReference/… que recomendou a abordagem para operações de maior volume. 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 Para mim, parece uma permissão de usuário, não um problema de função do IAM.
Jan Garaj 6/01
Tentei isso também e recebi a mesma mensagem de erro. Tenho certeza de que estou usando credenciais da conta que possui o pool de identidades - outras operações no pool funcionam bem. Ser uma permissão de usuário parece ... estranho ... mas se assim for, eu adoraria saber como obter uma permissão de usuário para um servidor.
Prisioneiro

Respostas:

6

Abordagem alternativa

Para recuperar o ID do usuário do Pool de usuários do usuário, você pode recuperar em sua lambda:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Isso retornará uma string que incluirá o ID do usuário do pool de usuários e será algo como:

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

Onde us-east-1_aaaaaaaaa é o ID do Pool de Usuários e qqqqqqqq-1111-2222-3333-rrrrrrrrrrrrr é o ID do Usuário do Pool de Usuários. Você pode dividir a sequência e extrair o ID do usuário.

Observe que essas informações serão diferentes, dependendo do provedor de autenticação que você está usando.

Então, se você precisar do nome de usuário em vez do ID do usuário, poderá extraí-lo diretamente do Pool de usuários, obtendo os detalhes apropriados para esse ID de usuário específico.

Referência

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

Xanthos Symeou
fonte
Aceite (tardiamente, mas feliz que você tenha recebido o representante de bônus), mesmo que a documentação dessa página diga: "Embora o processo abaixo não esteja documentado", gostaria que houvesse uma maneira documentada real de fazer isso.
Prisioneiro