Estoy usando AWS Congito User Pools para la administración de cuentas con un Cognito Identity Pool que tiene este User Pool como proveedor de identidad. Estoy usando esto para controlar el acceso a una API a través de API Gateway que envía solicitudes a Lambda. Mi Lambda se implementa con Java 8 usando Micronaut. Todo esto está funcionando bien.
En Lambda, obtengo el nombre de Principal
en 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;
}
Lo que está regresando en el nombre de cadena de Cognito identityId. Algo como esto:
us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx
Me gustaría registrar el inicio de sesión del usuario real o al menos tener alguna forma de convertir el identificador de identidad al inicio de sesión cuando sea necesario.
La llamada a la API LookupDeveloperIdentity parece ser la forma correcta de hacerlo, pero no puedo hacer que funcione.
Intentando hacer esto con Java y 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;
}
lanza una excepción
software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: No tiene acceso a esta identidad (Servicio: CognitoIdentity, Código de estado: 400, ID de solicitud: 64e36646-612b-4985-91d1-82aca770XXXX)
Intentar hacer esto a través de la CLI produce un resultado similar:
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
Se produjo un error (NotAuthorizedException) al llamar a la operación LookupDeveloperIdentity: no tiene acceso a esta identidad
Me he asegurado de que la política de IAM en vigor debería poder manejar esto, y cuando lo intento con un rol que no tiene esta política, obtengo un error diferente
{
"Effect": "Allow",
"Action": [
"cognito-identity:LookupDeveloperIdentity"
],
"Resource": [
"arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
]
}
Entonces las preguntas se reducen a:
- ¿Es esta la mejor manera de obtener el nombre de usuario del grupo de usuarios del ID del grupo de identidad?
- Si es así, ¿qué estoy haciendo incorrectamente?
- Si no es así, ¿cuál es una mejor manera de hacerlo?
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 mí parece un permiso de usuario, no un problema de rol de IAM.Respuestas:
Enfoque alternativo
Para recuperar la identificación de usuario del grupo de usuarios del usuario, puede recuperar en su lambda:
Esto devolverá una cadena que incluirá la ID de usuario del grupo de usuarios del usuario y se verá algo así como:
Donde us-east-1_aaaaaaaaa es el ID del grupo de usuarios y qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr es el ID del usuario del grupo de usuarios. Luego puede dividir la cadena y extraer la ID de usuario.
Tenga en cuenta que esta información será diferente según el proveedor de autenticación que esté utilizando.
Luego, si necesita el nombre de usuario en lugar de la ID de usuario, puede extraerlo directamente del grupo de usuarios obteniendo los detalles apropiados para esa ID de usuario específica.
Referencia
https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html
fuente