Ich verwende AWS Congito-Benutzerpools für die Kontoverwaltung mit einem Cognito-Identitätspool, der diesen Benutzerpool als Identitätsanbieter hat. Ich verwende dies, um den Zugriff auf eine API über das API-Gateway zu steuern, das Anforderungen an Lambda sendet. Mein Lambda wird mit Java 8 unter Verwendung von Micronaut implementiert. All dies funktioniert gut.
In der Lambda bekomme ich den Namen von der Principal
in 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;
}
Was kommt im String-Namen der Cognito-Identitäts-ID zurück? Etwas wie das:
us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx
Ich möchte entweder die tatsächliche Benutzeranmeldung protokollieren oder zumindest die Identitäts-ID bei Bedarf in die Anmeldung konvertieren.
Der API-Aufruf LookupDeveloperIdentity scheint der richtige Weg zu sein, aber ich kann ihn nicht zum Laufen bringen.
Versuch, dies mit Java und dem AWS Java SDK 2 zu tun:
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öst eine Ausnahme aus
software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: Sie haben keinen Zugriff auf diese Identität (Dienst: CognitoIdentity, Statuscode: 400, Anforderungs-ID: 64e36646-612b-4985-91d1-82aca770XXXX)
Der Versuch, dies über die CLI zu tun, führt zu einem ähnlichen Ergebnis:
aws cognito-identity Lookup-Entwickleridentität --identity-id us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-east-1: xxxx0aa1-89f9-4418-be04- 7e83c838xxxx --max-results = 10
Beim Aufrufen der Operation LookupDeveloperIdentity ist ein Fehler aufgetreten (NotAuthorizedException): Sie haben keinen Zugriff auf diese Identität
Ich habe sichergestellt, dass die vorhandene IAM-Richtlinie damit umgehen kann, und wenn ich es mit einer Rolle versuche, die diese Richtlinie nicht enthält, wird ein anderer Fehler angezeigt
{
"Effect": "Allow",
"Action": [
"cognito-identity:LookupDeveloperIdentity"
],
"Resource": [
"arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
]
}
Die Fragen beschränken sich also auf:
- Ist dies der beste Weg, um den Benutzernamen des Benutzerpools aus der ID des Identitätspools abzurufen?
- Wenn ja - was mache ich falsch?
- Wenn nicht - wie geht das besser?
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 Für mich sieht es nach einer Benutzerberechtigung aus, nicht nach einem Problem mit der IAM-Rolle.Antworten:
Alternativer Ansatz
Um die Benutzerpool-Benutzer-ID des Benutzers abzurufen, können Sie sie in Ihrem Lambda abrufen:
Dies gibt eine Zeichenfolge zurück, die die Benutzerpool-Benutzer-ID des Benutzers enthält und ungefähr so aussieht:
Wobei us-east-1_aaaaaaaaa die Benutzerpool-ID und qqqqqqqq-1111-2222-3333-rrrrrrrrrrr die Benutzerpool-Benutzer-ID ist. Sie können dann die Zeichenfolge teilen und die Benutzer-ID extrahieren.
Beachten Sie, dass diese Informationen je nach verwendetem Authentifizierungsanbieter unterschiedlich sind.
Wenn Sie dann den Benutzernamen anstelle der Benutzer-ID benötigen, können Sie ihn direkt aus dem Benutzerpool extrahieren, indem Sie die entsprechenden Details für diese bestimmte Benutzer-ID abrufen.
Referenz
https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html
quelle