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.Réponses:
Approche alternative
Afin de récupérer l'ID utilisateur du groupe d'utilisateurs de l'utilisateur, vous pouvez récupérer dans votre lambda:
Cela renverra une chaîne qui inclura l'ID utilisateur du groupe d'utilisateurs et ressemblera à quelque chose comme:
Où us-east-1_aaaaaaaaaa est l'ID du pool d'utilisateurs et qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr est l'ID utilisateur du pool d'utilisateurs. Vous pouvez ensuite diviser la chaîne et extraire l'ID utilisateur.
Notez que ces informations seront différentes selon le fournisseur d'authentification que vous utilisez.
Ensuite, si vous avez besoin du nom d'utilisateur au lieu de l'ID utilisateur, vous pouvez l'extraire directement du pool d'utilisateurs en obtenant les détails appropriés pour cet ID utilisateur spécifique.
Référence
https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html
la source