Wie behebe ich die Fehler „Unable to verify secret hash for client“ in meiner Amazon Cognito-Benutzerpool-API?

Lesedauer: 3 Minute
0

Wenn ich versuche, auf meine Amazon Cognito-Benutzerpool-API zuzugreifen, erhalte ich die Fehlermeldung „Unable to verify secret hash for client“. Ich möchte dieses Problem beheben.

Lösung

Wenn du deinen Benutzerpool-App-Client als Client-Secret konfigurierst, musst du einen Secret-Hash-Wert in den Abfrageparameter der API aufnehmen. Wenn du keinen Secret-Hash-Wert angibst, gibt Amazon Cognito die Fehlermeldung Unable to verify secret hash for client zurück.

Berechne den Secret-Hash-Wert, um das Problem zu lösen. Füge dann den Wert ein, wenn du Amazon Cognito APIs aufrufst, die einen Secret-Hash akzeptieren, wie InitiateAuth oder ForgotPassword.

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Einen Secret-Hash-Wert berechnen

Zur Berechnung des Secret-Hash-Werts benötigst du die folgenden Informationen:

  • App-Client-ID
  • App-Client-Secret
  • Benutzername des Benutzers, der sich in deinem Amazon Cognito-Benutzerpool befindet

Führe die folgenden Schritte aus, um den Prozess zu automatisieren:

  1. Lade die neueste Version von Python für Windows von der Python-Website herunter. Installiere dann Python auf deinem lokalen Computer.
  2. Speichere das folgende Python-Beispielskript als .py-Datei. Du kannst die Datei zum Beispiel als secret_hash.py speichern. Das folgende Skript verwendet das Client-Secret der Anwendung als Schlüssel und die Hash-Funktion SHA256, um die Berechnung eines HMAC-Digests zu zeigen:
    import sys, hmac, hashlib, base64
    
    # Unpack command line arguments
    username, app_client_id, key = sys.argv[1:4]
    
    # Create message and key bytes
    message, key = (username + app_client_id).encode('utf-8'), key.encode('utf-8')
    
    # Calculate secret hash
    secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()
    
    print(f"Secret Hash for user '{username}': {secret_hash}")
    
    Hinweis: Ersetze username durch den Benutzernamen des Benutzers, der sich im Benutzerpool befindet. Ersetze außerdem app_client_id durch die App-Client-ID deines Benutzerpools und key durch das App-Client-Secret.
  3. Führe den folgenden Befehl aus, um den Secret-Hash-Wert zu ermitteln:
    python3 secret_hash.py username app_client_id app_client_secret
    Hinweis: Wenn du eine frühere Version von Python als Python 3.0 verwendest, ersetze python3 durch python. Ersetze secret_hash.py durch deinen Dateinamen, username durch den Benutzernamen des Benutzerpools, app_client_id durch deine App-Client-ID und app_client_secret durch das App-Client-Secret.

Secret-Hash-Werte in API-Aufrufe aufnehmen

Füge deinen Secret-Hash-Wert als SECRET_HASH-Parameter zu den Abfragezeichenfolgenparametern des API-Aufrufs ein.

Beispiel für einen InitiateAuth-API-Aufruf, der einen SECRET_HASH-Parameter enthält:

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=username,PASSWORD=password,SECRET_HASH=secret_hash --client-id example_client-id

Beispielausgabe des API-Aufrufs InitiateAuth:

{    
    "ChallengeParameters": {},

    "AuthenticationResult": {
        "AccessToken": "<HIDDEN>",
        "ExpiresIn": 3600,
        "TokenType":
    "Bearer",

        "RefreshToken": "<HIDDEN>",
        "IdToken": "<HIDDEN>"
    }
}

Hinweis: Wenn du den USER_PASSWORD_AUTH-Authentifizierungsablauf verwendest, aktiviere ALLOW_USER_PASSWORD_AUTH für den App-Client.

Beispiel für einen ForgotPassword API-Aufruf, der einen SECRET_HASH-Parameter enthält:

aws cognito-idp forgot-password --client-id example_client-id --username example_username --secret-hash example_secret-hash

Hinweis: Ersetze username durch deinen Benutzernamen und secret-hash durch deinen Secret-Hash-Wert.

Beispielausgabe des API-Aufrufs ForgotPassword:

{    
    "CodeDeliveryDetails": {
        "Destination": "+***********",
        "DeliveryMedium": "SMS",
        "AttributeName": "phone_number"
    }
}
AWS OFFICIAL
AWS OFFICIALAktualisiert vor 23 Tagen