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 Principal
no 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?
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.