“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-crypto
webpack 또는 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))
}