2016-05-25 8 views
35

Я застрял в «пулах пользователей Amazon Cognito Identity».Устранение: невозможно проверить секретный хэш для клиента в Amazon Cognito Userpools

Я пробовал все возможные коды для аутентификации пользователя в пользовательских путях cognito. Но я всегда получаю сообщение об ошибке «Ошибка: невозможно проверить секретный хеш для клиента 4b ******* fd».

Вот код:

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); 
     }); 

Пожалуйста, помогите!

+1

Принято ответ не действует больше. Инструкции, как генерировать секретный хэш, находятся здесь http://docs.aws.amazon.com/cognito/latest/developerguide/signing-up-users-in-your-app.html#cognito-user-pools-computing-secret- hash – jasiustasiu

ответ

56

Кажется, что в настоящее время AWS Cognito не обрабатывает клиентский секрет совершенно. Он будет работать в ближайшем будущем, но на данный момент он по-прежнему является бета-версией.

Для меня он отлично работает для приложения без секретности клиента, но не работает для приложения с секретностью клиента.

Итак, в вашем пуле пользователей попробуйте создать новое приложение, не создавая секрет клиента. Затем используйте это приложение для регистрации нового пользователя или для подтверждения регистрации.

+0

Могу ли я работать «приложение без секретности клиента» в javascript – eronax59

+0

, и если да, то позвольте мне научить, как я могу внедрить это. – eronax59

+0

Как я уже сказал, создайте новое приложение внутри консоли AWS UserPools и снимите флажок «Сгенерировать секрет клиента». Затем в коде, который вы опубликовали, я думаю, что вы можете заменить ClientId в объекте poolData идентификатором клиента, соответствующим приложению, которое вы только что создали. –

0

это код PHP пример, который я использую для генерации этого секрет окрошка

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

в этом случае результат: DdSuILDJ2V84zfOChcn6TfgmlfnHsUYq0J6c01QV43I =

8

Для всех, кто заинтересован в использовании AWS Lambda подписать вверх пользователь использует AWS JS SDK, это шаги, которые я сделал:

Создайте еще одну лямбда-функцию в питоне, чтобы сгенерировать ключ:

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() 

Вызвать функцию через функцию nodeJS в AWS. Подпись действовал как секретный хэш для Cognito

Примечание: Ответ основан в значительной степени от ответа Джорджа Кэмпбелла в следующей ссылке: Calculating a SHA hash with a string + secret key in python

27

Согласно Docs: http://docs.aws.amazon.com/cognito/latest/developerguide/setting-up-the-javascript-sdk.html

Javascript SDK не поддерживает приложения с секретностью клиента.

В инструкциях указано, что при создании приложения для пула пользователей вам необходимо снять флажок «Генерировать секрет клиента».

1

В Java вы можете использовать этот код:

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

Где вы используете этот секретный хеш в SDK, помимо вывода его на экран? – Aaron

+0

Может ли кто-нибудь указать на какие-либо документы AWS в Интернете, где объясняется аутентификация в отношении секретности клиента? Подписи-кодировки base64/sha256 являются неотразимыми решениями, но они бесполезны, если они явно не соответствуют документам AWS, которые описывают, как аутентифицироваться в отношении секретности клиента. –

0

У меня была такая же проблема в .NET SDK.

Вот как я решил в, в случае, если кто-то нуждается в этом:

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; 
     } 
    } 
} 

Подписание будет выглядеть следующим образом:

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

Поскольку все остальные выложила свой язык, вот узел (и он работает в браузере с помощью browserify-crypto, автоматически используется при использовании webpack или профайлируйте):

const crypto = require('crypto'); 

... 

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

Решение для golang. Похоже, это должно быть добавлено в 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++ с Qt Framework

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(); 
};