2016-05-25 2 views
35

Je suis bloqué dans le processus "Amazon Cognito Identity user pools".Résoudre: Impossible de vérifier le hachage secret pour le client dans les pools d'utilisateurs Amazon Cognito

J'ai essayé tous les codes possibles pour authentifier l'utilisateur dans les pools utilisateurs cognito. Mais je reçois toujours une erreur en disant "Erreur: Impossible de vérifier le hachage secret pour le client 4b ******* fd".

Voici le code:

AWS.config.region = 'us-east-1'; // Region 
      AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
       IdentityPoolId: 'us-east-1:b64bb629-ec73-4569-91eb-0d950f854f4f' 
      }); 

      AWSCognito.config.region = 'us-east-1'; 
      AWSCognito.config.credentials = new AWS.CognitoIdentityCredentials({ 
       IdentityPoolId: 'us-east-1:b6b629-er73-9969-91eb-0dfffff445d' 
      }); 

      AWSCognito.config.update({accessKeyId: 'AKIAJNYLRONAKTKBXGMWA', secretAccessKey: 'PITHVAS5/UBADLU/dHITesd7ilsBCm'}) 

      var poolData = { 
       UserPoolId : 'us-east-1_l2arPB10', 
       ClientId : '4bmsrr65ah3oas5d4sd54st11k' 
      }; 
      var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData); 

      var userData = { 
       Username : '[email protected]', 
       Pool : userPool 
      }; 

      var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData); 

      cognitoUser.confirmRegistration('123456', true,function(err, result) { 
      if (err) { 
       alert(err); 
       return; 
      } 
      console.log('call result: ' + result); 
     }); 

S'il vous plaît aider!

+1

acceptés réponse ne sera plus valable. Instructions pour générer des hash secrets sont ici http://docs.aws.amazon.com/cognito/latest/developerguide/signing-up-users-in-your-app.html#cognito-user-pools-computing-secret- hash – jasiustasiu

Répondre

56

Il semble que AWS Cognito ne gère pas parfaitement le secret client. Cela fonctionnera dans un futur proche mais pour l'instant c'est toujours une version bêta. Pour moi, cela fonctionne très bien pour une application sans un secret client, mais échoue pour une application avec un secret client.

Ainsi, dans votre pool d'utilisateurs, essayez de créer une nouvelle application sans générer de secret client. Ensuite, utilisez cette application pour vous inscrire à un nouvel utilisateur ou pour confirmer votre inscription.

+0

Donc, je peux travailler "application sans un secret client" en javascript – eronax59

+0

et Si oui, laissez-moi enseigner comment je peux implémenter cela. – eronax59

+0

comme je l'ai dit, créez une nouvelle application dans votre console AWS UserPools, et décochez la case "Générer le secret client". Ensuite, dans le code que vous avez posté, je pense que vous pouvez remplacer le ClientId de votre objet poolData par l'identifiant du client correspondant à l'application que vous venez de créer. –

0

ceci est un exemple de code php que j'utilise pour générer le hachage secrète

<?php 
    $userId = "aaa"; 
    $clientId = "bbb"; 
    $clientSecret = "ccc"; 
    $s = hash_hmac('sha256', $userId.$clientId, $clientSecret, true); 
    echo base64_encode($s); 
?> 

dans ce cas, le résultat est: DdSuILDJ2V84zfOChcn6TfgmlfnHsUYq0J6c01QV43I =

8

Pour toute personne intéressée à utiliser AWS Lambda pour signer un utilisateur utilisant le SDK AWS JS, voici les étapes que j'ai effectuées:

Créer une autre fonction lambda en python pour générer la clé:

import hashlib 
import hmac 
import base64 
    secretKey = "key" 
    clientId = "clientid" 
    digest = hmac.new(secretKey, msg=username + clientId, digestmod=hashlib.sha256).digest() 
    signature = base64.b64encode(digest).decode() 

Appelez la fonction via la fonction nodeJS dans AWS. La signature a agi comme le hachage secret Cognito

Note: La réponse est basé en grande partie de la réponse de George Campbell dans le lien suivant: Calculating a SHA hash with a string + secret key in python

1

En Java, vous pouvez utiliser ce code:

private String getSecretHash(String email, String appClientId, String appSecretKey) throws Exception { 
    byte[] data = (email + appClientId).getBytes("UTF-8"); 
    byte[] key = appSecretKey.getBytes("UTF-8"); 

    return Base64.encodeAsString(HmacSHA256(data, key)); 
} 

static byte[] HmacSHA256(byte[] data, byte[] key) throws Exception { 
    String algorithm = "HmacSHA256"; 
    Mac mac = Mac.getInstance(algorithm); 
    mac.init(new SecretKeySpec(key, algorithm)); 
    return mac.doFinal(data); 
} 
+0

Où utilisez-vous ce hachage secret dans le SDK en plus de le sortir à l'écran? – Aaron

+0

Quelqu'un peut-il pointer vers n'importe quel document AWS en ligne où l'authentification par rapport au secret client est expliquée? Les encodages de signature de base64/sha256 sont des solutions convaincantes - mais sans valeur à moins qu'ils ne soient explicitement compatibles avec les documents AWS expliquant comment s'authentifier par rapport au secret client. –

0

J'ai eu le même problème dans le .NET SDK.

Voilà comment je résolu, au cas où quelqu'un d'autre a besoin il:

public static class CognitoHashCalculator 
{ 
    public static string GetSecretHash(string username, string appClientId, string appSecretKey) 
    { 
     var dataString = username + appClientId; 

     var data = Encoding.UTF8.GetBytes(dataString); 
     var key = Encoding.UTF8.GetBytes(appSecretKey); 

     return Convert.ToBase64String(HmacSHA256(data, key)); 
    } 

    public static byte[] HmacSHA256(byte[] data, byte[] key) 
    { 
     using (var shaAlgorithm = new System.Security.Cryptography.HMACSHA256(key)) 
     { 
      var result = shaAlgorithm.ComputeHash(data); 
      return result; 
     } 
    } 
} 

L'inscription ressemble alors à ceci:

public class CognitoSignUpController 
{ 
    private readonly IAmazonCognitoIdentityProvider _amazonCognitoIdentityProvider; 

    public CognitoSignUpController(IAmazonCognitoIdentityProvider amazonCognitoIdentityProvider) 
    { 
     _amazonCognitoIdentityProvider = amazonCognitoIdentityProvider; 
    } 

    public async Task<bool> SignUpAsync(string userName, string password, string email) 
    { 
     try 
     { 
      var request = CreateSignUpRequest(userName, password, email); 
      var authResp = await _amazonCognitoIdentityProvider.SignUpAsync(request); 

      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

    private static SignUpRequest CreateSignUpRequest(string userName, string password, string email) 
    { 
     var clientId = ConfigurationManager.AppSettings["ClientId"]; 
     var clientSecretId = ConfigurationManager.AppSettings["ClientSecretId"]; 

     var request = new SignUpRequest 
     { 
      ClientId = clientId, 
      SecretHash = CognitoHashCalculator.GetSecretHash(userName, clientId, clientSecretId), 
      Username = userName, 
      Password = password, 
     }; 

     request.UserAttributes.Add("email", email); 
     return request; 
    } 
} 
0

Comme tout le monde a affiché leur langue, le nœud est ici (et cela fonctionne dans le navigateur avec browserify-crypto, utilisé automatiquement si vous utilisez webpack ou browserify):

const crypto = require('crypto'); 

... 

crypto.createHmac('SHA256', clientSecret) 
    .update(username + clientId) 
    .digest('base64') 
4

Solution pour golang. On dirait que cela devrait être ajouté au SDK.

import (
    "crypto/hmac" 
    "crypto/sha256" 
    "encoding/base64" 
) 

func SecretHash(username, clientID, clientSecret string) string { 
    mac := hmac.New(sha256.New, []byte(clientSecret)) 
    mac.Write([]byte(username + ClientID)) 
    return base64.StdEncoding.EncodeToString(mac.Sum(nil)) 
} 
0

C++ avec le framework Qt

QByteArray MyObject::secretHash(
    const QByteArray& email, 
    const QByteArray& appClientId, 
    const QByteArray& appSecretKey) 
{ 
      QMessageAuthenticationCode code(QCryptographicHash::Sha256); 
      code.setKey(appSecretKey); 
      code.addData(email); 
      code.addData(appClientId); 
      return code.result().toBase64(); 
};