Come posso risolvere gli errori "Unable to verify secret hash for client" ricevuti dall'API dei pool di utenti in Amazon Cognito?

3 minuti di lettura
0

Quando provo ad accedere all'API dei pool di utenti di Amazon Cognito, ricevo l'errore "Unable to verify secret hash for client". Desidero risolvere questo problema.

Risoluzione

Quando nella configurazione del client di app del tuo pool di utenti scegli il tipo segreto client, devi includere un valore hash segreto nel parametro di query dell'API. Se non includi un valore hash segreto, Amazon Cognito restituisce l'errore Unable to verify secret hash for client.

Per risolvere il problema, calcola il valore hash segreto. Quindi includi il valore quando invochi API di Amazon Cognito che accettano hash segreti, come InitiateAuth o ForgotPassword.

Nota: se ricevi errori durante l’esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Calcola un valore hash segreto

Per calcolare il tuo valore hash segreto, devi disporre delle seguenti informazioni:

  • ID del client di app
  • Segreto del client di app
  • Nome utente dell'utente facente parte del tuo pool di utenti Amazon Cognito

Per automatizzare il processo, completa i seguenti passaggi:

  1. Scarica l'ultima versione di Python per Windows dal sito web di Python. Quindi installa Python sul tuo computer locale.
  2. Salva lo script Python dell'esempio seguente come file .py. Ad esempio, puoi salvare il file come secret_hash.py. Lo script seguente utilizza il segreto client dell'applicazione come chiave e la funzione hash SHA256 per mostrare il calcolo di un digest HMAC:
    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}")
    
    Nota: sostituisci username con il nome utente dell'utente facente parte del pool di utenti. Inoltre, sostituisci app_client_id con l'ID client di app del tuo pool di utenti e key con il segreto del tuo client di app.
  3. Per ottenere il valore hash segreto, esegui il comando seguente:
    python3 secret_hash.py username app_client_id app_client_secret
    Nota: se stai utilizzando una versione di Python precedente a Python 3.0, sostituisci python3 con python. Sostituisci secret_hash.py con il nome del tuo file, username con il nome utente dell'utente facente parte del pool di utenti, app_client_id con l'ID del tuo client di app e app_client_secret con il segreto del tuo client di app.

Includi i valori hash segreti nelle chiamate API

Aggiungi il tuo valore hash segreto come parametro SECRET_HASH nei parametri della stringa di query della chiamata API.

Esempio di chiamata API InitiateAuth che include un parametro SECRET_HASH:

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

Esempio di output della chiamata API InitiateAuth:

{    
    "ChallengeParameters": {},

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

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

Nota: se utilizzi il flusso di autenticazione USER_PASSWORD_AUTH, attiva ALLOW_USER_PASSWORD_AUTH per il client di app.

Esempio di chiamata API ForgotPassword che include un parametro SECRET_HASH:

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

Nota: sostituisci username con il tuo nome utente e secret-hash con il tuo valore hash segreto.

Esempio di output della chiamata API ForgotPassword:

{    
    "CodeDeliveryDetails": {
        "Destination": "+***********",
        "DeliveryMedium": "SMS",
        "AttributeName": "phone_number"
    }
}
AWS UFFICIALE
AWS UFFICIALEAggiornata 3 mesi fa