Abrufen des Benutzernamens des Cognito-Benutzerpools aus der Identitäts-ID des Cognito-Identitätspools

10

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 Principalin 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?
Häftling
quelle
Könnten Sie docs.aws.amazon.com/cognitoidentity/latest/APIReference/… ausprobieren , das den empfohlenen Ansatz für Operationen mit höherem Volumen empfiehlt. 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.
Jan Garaj
Ich habe das auch versucht und die gleiche Fehlermeldung erhalten. Ich bin sicher, dass ich Anmeldeinformationen aus dem Konto verwende, dem der Identitätspool gehört - andere Vorgänge im Pool funktionieren einwandfrei. Es scheint ... seltsam ... eine Benutzerberechtigung zu sein, aber wenn ja, würde ich gerne wissen, wie man eine Benutzerberechtigung für einen Server erhält.
Gefangener

Antworten:

6

Alternativer Ansatz

Um die Benutzerpool-Benutzer-ID des Benutzers abzurufen, können Sie sie in Ihrem Lambda abrufen:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Dies gibt eine Zeichenfolge zurück, die die Benutzerpool-Benutzer-ID des Benutzers enthält und ungefähr so ​​aussieht:

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

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

Xanthos Symeou
quelle
Akzeptiert (verspätet, aber froh, dass Sie den Bonus-Repräsentanten erhalten haben), obwohl in der Dokumentation auf dieser Seite steht: "Obwohl der folgende Prozess nicht dokumentiert ist" Wünschte, es gäbe einen tatsächlich dokumentierten Weg, dies zu tun.
Gefangener