¿Cómo puedo solucionar los errores «Unable to verify secret hash for client» en mi API de grupos de usuarios de Amazon Cognito?

4 minutos de lectura
0

Cuando intento acceder a mi API de grupos de usuarios de Amazon Cognito, aparece el error «Unable to verify secret hash for client». Quiero solucionar este problema.

Resolución

Cuando configura el cliente de la aplicación del grupo de usuarios como un secreto de cliente, debe incluir un valor de hash secreto en el parámetro de consulta de la API. Si no incluye un valor de hash secreto, Amazon Cognito devuelve el siguiente error: No se puede verificar el hash secreto para el cliente.

Para resolver el problema, calcule el valor de hash secreto. A continuación, incluya el valor cuando invoque las API de Amazon Cognito que acepten un hash secreto, como InitiateAuth o ForgotPassword.

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Cálculo de un valor de hash secreto

Para calcular el valor de hash secreto, debe disponer de la siguiente información:

  • ID de cliente de la aplicación
  • Secreto de cliente de la aplicación
  • Nombre de usuario del usuario que está en el grupo de usuarios de Amazon Cognito

Para automatizar el proceso, siga estos pasos:

  1. Descargue la versión más reciente de Python para Windows en el sitio web de Python. A continuación, instale Python en su equipo local.
  2. Guarde el siguiente script de Python de ejemplo como archivo .py. Por ejemplo, puede guardar el archivo como secret_hash.py. El siguiente script usa el secreto de cliente de la aplicación como clave y la función hash SHA256 para mostrar el cálculo de un resumen de 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: Sustituya username por el nombre de usuario del grupo de usuarios. Además, sustituya app_client_id por el ID de cliente de la aplicación del grupo de usuarios y la clave por el secreto del cliente de la aplicación.
  3. Para obtener el valor de hash secreto, ejecute el siguiente comando:
    python3 secret_hash.py username app_client_id app_client_secret
    Nota: Si está ejecutando una versión de Python anterior a Python 3.0, sustituya python3 por python. Sustituya secret_hash.py por el nombre de archivo, el username por el nombre de usuario del grupo de usuarios, app_client_id por el ID de cliente de la aplicación y app_client_secret por el secreto de cliente de la aplicación.

Inclusión de valores de hash secreto en las llamadas a la API

Agregue su valor de hash secreto como parámetro SECRET_HASH en los parámetros de la cadena de consulta de la llamada a la API.

Ejemplo de llamada a la API InitiateAuth con un parámetro SECRET_HASH incluido:

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

Ejemplo de respuesta de la llamada a la API InitiateAuth:

{    
    "ChallengeParameters": {},

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

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

Nota: Si usa el flujo de autenticación USER_PASSWORD_AUTH, active ALLOW_USER_PASSWORD_AUTH para el cliente de la aplicación.

Ejemplo de llamada a la API ForgotPassword con un parámetro SECRET_HASH incluido:

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

Nota: Sustituya username por su nombre de usuario y secret-hash por su valor de hash secreto.

Ejemplo de respuesta de la llamada a la API ForgotPassword:

{    
    "CodeDeliveryDetails": {
        "Destination": "+***********",
        "DeliveryMedium": "SMS",
        "AttributeName": "phone_number"
    }
}
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 4 meses