Obtener el nombre de usuario del grupo de usuarios cognito del grupo de identidad cognito identityId

10

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 Principalen 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?
Prisionero
fuente
¿Podría probar docs.aws.amazon.com/cognitoidentity/latest/APIReference/... ese enfoque recomendado para operaciones de mayor volumen? 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.
Jan Garaj
Intenté eso también, y recibí el mismo mensaje de error. Estoy seguro de que estoy usando credenciales de la cuenta que posee el grupo de identidades; otras operaciones en el grupo funcionan bien. Ser un permiso de usuario parece ... extraño ... pero si es así, me encantaría saber cómo obtener un permiso de usuario para un servidor.
Prisionero el

Respuestas:

6

Enfoque alternativo

Para recuperar la identificación de usuario del grupo de usuarios del usuario, puede recuperar en su lambda:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Esto devolverá una cadena que incluirá la ID de usuario del grupo de usuarios del usuario y se verá algo así 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

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

Xanthos Symeou
fuente
Aceptado (tardíamente, pero contento de haber recibido el representante de bonificación), incluso aunque la documentación en esa página dice: "Si bien el proceso a continuación no está documentado" Ojalá hubiera una forma real documentada de hacer esto.
Prisionero el