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

4 minutos de lectura
0

Cuando intento invocar mi API de grupos de usuarios de Amazon Cognito, aparece el error «Unable to verify secret hash for client <client-id>». ¿Cómo puedo solucionar este error?

Breve descripción

Cuando se configura un cliente de aplicación de grupo de usuarios con un secreto de cliente en el grupo de usuarios, debe haber un valor de SecretHash en el argumento de la consulta de la API. Si no se proporciona un hash secreto en el argumento de la consulta de la API, Amazon Cognito devolverá un error Unable to verify secret hash for client <client-id>.

En el siguiente ejemplo se muestra cómo crear un valor de SecretHash e incluirlo en la llamada a la API InitiateAuth o ForgotPassword.

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), compruebe si está utilizando la versión más reciente de la AWS CLI.

Para crear un valor de SecretHash

Siga las instrucciones en Computing SecretHash values. Necesitará el identificador del cliente de la aplicación, el secreto del cliente de la aplicación y el nombre de usuario en el grupo de usuarios de Amazon Cognito.

\Alternativa:

Para automatizar el proceso, siga estos pasos:

1.    Si aún no lo ha hecho, instale Python.

2.    Guarde el siguiente script de Python de ejemplo como archivo .py:

import sys
import hmac, hashlib, base64

username = sys.argv[1]
app_client_id = sys.argv[2]
key = sys.argv[3]
message = bytes(sys.argv[1]+sys.argv[2],'utf-8')
key = bytes(sys.argv[3],'utf-8')
secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

print("SECRET HASH:",secret_hash)

Nota: Sustituya los valores siguientes antes de ejecutar el script de ejemplo: En username, introduzca el nombre de usuario en el grupo de usuarios. En app_client_id, indique el identificador del cliente de la aplicación del grupo de usuarios. En key, introduzca el secreto del cliente de la aplicación.

3.    Ejecute el siguiente comando para ejecutar el script:

python3 secret_hash.py <username> <app_client_id> <app_client_secret>

Nota: Sustituya los siguientes valores antes de ejecutar el comando: Si está ejecutando una versión de Python anterior a Python 3.0, reemplace python3 por python. En secret_hash.py, introduzca el nombre del archivo del script de ejemplo. En username, indique el nombre de usuario del grupo de usuarios. En app_client_id, introduzca el identificador del cliente de la aplicación. En app_client_secret, indique el secreto del cliente de la aplicación.

La respuesta del comando devuelve un valor de SecretHash.

Para incluir valores de SecretHash en las llamadas a la API

Nota: El valor de SecretHash no es imprescindible en las llamadas a la API de Amazon Cognito si el cliente de la aplicación no se ha configurado con un secreto de cliente de la aplicación. Para obtener más información, consulte Configuring a user pool app client.

Añada el valor de SecretHash que creó como parámetro SECRET_HASH en los parámetros de la cadena de la 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 <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 utiliza el flujo de autenticación USER_PASSWORD_AUTH, compruebe que se haya activado ALLOW_USER_PASSWORD_AUTH.

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

$ aws cognito-idp forgot-password --client-id <client-id> --username <username> --secret-hash <secret-hash>

Ejemplo de respuesta de la llamada a la API ForgotPassword

{
    "CodeDeliveryDetails": {
        "Destination": "+***********",
        "DeliveryMedium": "SMS",
        "AttributeName": "phone_number"
    }
}

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 3 años