Korzystam z pul użytkowników AWS Congito do zarządzania kontami z pulą tożsamości Cognito, która ma tę pulę użytkowników jako dostawcę tożsamości. Używam tego do kontrolowania dostępu do API poprzez API Gateway, który wysyła żądania do Lambda. My Lambda jest implementowana w Javie 8 za pomocą Micronaut. Wszystko działa dobrze.
W Lambda, Dostaję nazwę od Principal
w 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;
}
Co wraca w nazwie ciągu Cognito Identyfikator tożsamości. Coś takiego:
us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx
Chciałbym albo zalogować rzeczywisty login użytkownika, albo przynajmniej w jakiś sposób przekonwertować identyfikator tożsamości na login, gdy zajdzie taka potrzeba.
LookupDeveloperIdentity wywołanie API wydaje się być dobrym sposobem, aby przejść na ten temat, ale jestem w stanie zmusić go do pracy.
Próba zrobienia tego w Javie i 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;
}
zgłasza wyjątek
software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: Nie masz dostępu do tej tożsamości (usługa: CognitoIdentity, kod statusu: 400, identyfikator żądania: 64e36646-612b-4985-91d1-82aca770XXXX)
Próba zrobienia tego za pośrednictwem interfejsu CLI daje podobny wynik:
aws cognito-tożsamości 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
Wystąpił błąd (NotAuthorizedException) podczas wywoływania operacji LookupDeveloperIdentity: Nie masz dostępu do tej tożsamości
Upewniłem się, że obowiązująca polityka IAM powinna być w stanie sobie z tym poradzić, a gdy spróbuję z rolą, która nie ma tej zasady, pojawia się inny błąd
{
"Effect": "Allow",
"Action": [
"cognito-identity:LookupDeveloperIdentity"
],
"Resource": [
"arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
]
}
Pytania sprowadzają się więc do:
- Czy to najlepszy sposób na uzyskanie nazwy użytkownika puli użytkowników z identyfikatora puli tożsamości?
- Jeśli tak - co robię niepoprawnie?
- Jeśli tak nie jest - jaki jest lepszy sposób?
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 Dla mnie wygląda to na pozwolenie użytkownika, a nie problem roli IAM.Odpowiedzi:
Alternatywne podejście
Aby pobrać identyfikator użytkownika puli użytkowników, możesz pobrać w lambda:
Zwróci ciąg zawierający identyfikator użytkownika puli użytkowników i będzie wyglądał mniej więcej tak:
Gdzie us-east-1_aaaaaaaaa jest identyfikatorem puli użytkowników, a qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr jest identyfikatorem użytkownika puli użytkowników. Następnie możesz podzielić ciąg i wyodrębnić identyfikator użytkownika.
Pamiętaj, że informacje te będą się różnić w zależności od używanego dostawcy uwierzytelnienia.
Następnie, jeśli potrzebujesz nazwy użytkownika zamiast identyfikatora użytkownika, możesz wyodrębnić go bezpośrednio z puli użytkownika, uzyskując odpowiednie szczegóły dla tego konkretnego identyfikatora użytkownika.
Odniesienie
https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html
źródło