J'utilise les pools d'utilisateurs AWS Congito pour la gestion des comptes avec un pool d'identités Cognito qui a ce pool d'utilisateurs comme fournisseur d'identité. J'utilise cela pour contrôler l'accès à une API via API Gateway qui envoie des demandes à Lambda. My Lambda est implémenté avec Java 8 à l'aide de Micronaut. Tout cela fonctionne bien.
Dans la Lambda, je reçois le nom de la Principal
dans 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;
}
Ce qui revient dans le nom de chaîne du Cognito identityId. Quelque chose comme ça:
us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx
Je voudrais soit enregistrer la connexion utilisateur réelle, soit au moins avoir un moyen de convertir l'ID d'identité en connexion lorsque cela est nécessaire.
L' appel de l' API LookupDeveloperIdentity semble être la bonne façon de procéder, mais je ne parviens pas à le faire fonctionner.
Tenter de le faire avec Java et le kit 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;
}
lève une exception
software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: Vous n'avez pas accès à cette identité (Service: CognitoIdentity, Code d'état: 400, ID de demande: 64e36646-612b-4985-91d1-82aca770XXXX)
Tenter de le faire via la CLI produit un résultat similaire:
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
Une erreur s'est produite (NotAuthorizedException) lors de l'appel de l'opération LookupDeveloperIdentity: vous n'avez pas accès à cette identité
Je me suis assuré que la stratégie IAM en place devrait être en mesure de gérer cela, et lorsque je l'essaie avec un rôle qui n'a pas cette stratégie, j'obtiens une erreur différente
{
"Effect": "Allow",
"Action": [
"cognito-identity:LookupDeveloperIdentity"
],
"Resource": [
"arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
]
}
Les questions se résument donc à:
- Est-ce la meilleure façon d'obtenir le nom d'utilisateur du pool d'utilisateurs à partir de l'ID du pool d'identités?
- Si c'est le cas - qu'est-ce que je fais mal?
- Si ce n'est pas le cas - quelle est la meilleure façon de procéder?
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 Pour moi, cela ressemble à une autorisation utilisateur, pas à un problème de rôle IAM.