[amazon-web-services] Amazon Cognito 사용자 풀에서 클라이언트에 대한 비밀 해시를 확인할 수 없음

“Amazon Cognito Identity 사용자 풀”프로세스에 갇혀 있습니다.

시크릿 사용자 풀에서 사용자를 인증하기 위해 가능한 모든 코드를 시도했습니다. 하지만 항상 “오류 : 클라이언트 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 : 'ronakpatel@gmail.com',
     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);
});



답변

현재 AWS Cognito는 클라이언트 암호를 완벽하게 처리하지 못하는 것 같습니다. 가까운 장래에 작동하지만 현재로서는 아직 베타 버전입니다.

나에게는 클라이언트 비밀이없는 앱에서는 잘 작동하지만 클라이언트 비밀이있는 앱에서는 실패합니다.

따라서 사용자 풀에서 클라이언트 암호를 생성하지 않고 새 앱을 만들어보십시오. 그런 다음 해당 앱을 사용하여 새 사용자를 등록하거나 등록을 확인합니다.


답변

문서에 따르면 : http://docs.aws.amazon.com/cognito/latest/developerguide/setting-up-the-javascript-sdk.html

Javascript SDK는 클라이언트 시크릿이있는 앱을 지원하지 않습니다.

이제 지침에 사용자 풀용 앱을 만들 때 “클라이언트 암호 생성”을 선택 취소해야한다고 명시되어 있습니다.


답변

이것은 몇 년 늦을 수 있지만 “클라이언트 비밀 생성”옵션을 선택 취소하면 웹 클라이언트에서 작동합니다.

앱 클라이언트 옵션 생성


답변

다른 모든 사람들이 자신의 언어를 게시했기 때문에 여기 노드가 있습니다 (그리고 브라우저에서 작동하며 browserify-cryptowebpack 또는 browserify를 사용하는 경우 자동으로 사용됨).

const crypto = require('crypto');

...

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


답변

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


답변

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

AWS에서 nodeJS 함수를 통해 함수를 호출합니다. 서명은 Cognito의 비밀 해시 역할을했습니다.

참고 : 대답은 다음 링크에있는 George Campbell의 대답을 기반으로합니다. 파이썬에서 문자열 + 비밀 키로 SHA 해시 계산


답변

대한 솔루션 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))
}