Lorsque j’essaie d’accéder à mon API de groupes d’utilisateurs Amazon Cognito, le message d’erreur « Unable to verify secret hash for client » s’affiche. Je souhaite résoudre ce problème.
Résolution
Lorsque vous configurez le client d’application de votre groupe d'utilisateurs en tant que secret client, vous devez inclure une valeur de hachage secrète dans le paramètre de requête de l'API. Si vous n'incluez pas de valeur de hachage secrète, Amazon Cognito renvoie une erreur Unable to verify secret hash for client.
Pour résoudre le problème, calculez la valeur de hachage secrète. Puis, incluez la valeur lorsque vous invoquez les API Amazon Cognito qui acceptent le hachage secret, telles que InitiateAuth ou ForgotPassword.
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.
Calculer une valeur de hachage secrète
Pour calculer votre valeur de hachage secrète, vous devez disposer des informations suivantes :
- ID du client d'application
- Secret du client d'application
- Nom d'utilisateur de l'utilisateur qui fait partie de votre groupe d'utilisateurs Amazon Cognito
Pour automatiser le processus, procédez comme suit :
- Téléchargez la dernière version de Python pour Windows sur le site Web de Python. Puis, installez Python sur votre ordinateur local.
- Enregistrez l’exemple de script Python suivant dans un fichier .py. Par exemple, vous pouvez enregistrer le fichier sous le nom secret_hash.py. Le script suivant utilise le secret du client d'application comme clé et la fonction de hachage SHA256 pour afficher le calcul d'un résumé 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}")
Remarque : Remplacez username par le nom d'utilisateur de l'utilisateur qui fait partie du groupe d'utilisateurs. Remplacez également app_client_id par l'ID du client d'application de votre groupe d'utilisateurs et key par le secret de votre client d'application.
- Pour obtenir la valeur de hachage secrète, exécutez la commande suivante :
python3 secret_hash.py username app_client_id app_client_secret
Remarque : Si vous utilisez une version de Python antérieure à Python 3.0, remplacez python3 par python. Remplacez secret_hash.py par le nom de votre fichier, username par le nom d'utilisateur du groupe d'utilisateurs, app_client_id par l'ID de votre client d'application et app_client_secret par le secret de votre client d'application.
Inclure des valeurs de hachage secrète dans les appels d’API
Ajoutez votre valeur de hachage secrète en tant que paramètre SECRET_HASH dans les paramètres de chaîne de requête de l'appel d'API.
Exemple d’appel d’API InitiateAuth incluant un paramètre 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
Exemple de sortie d’appel d’API InitiateAuth :
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "<HIDDEN>",
"ExpiresIn": 3600,
"TokenType":
"Bearer",
"RefreshToken": "<HIDDEN>",
"IdToken": "<HIDDEN>"
}
}
Remarque : Si vous utilisez le flux d'authentification USER_PASSWORD_AUTH, activez ALLOW_USER_PASSWORD_AUTH pour le client d’application.
Exemple d’appel d’API ForgotPassword incluant un paramètre SECRET_HASH :
aws cognito-idp forgot-password --client-id example_client-id --username example_username --secret-hash example_secret-hash
Remarque : Remplacez username par votre nom d'utilisateur et secret-hash par votre valeur de hachage secrète.
Exemple de sortie d’appel d’API ForgotPassword :
{
"CodeDeliveryDetails": {
"Destination": "+***********",
"DeliveryMedium": "SMS",
"AttributeName": "phone_number"
}
}