Amazon Cognito 사용자 풀 API에 액세스하려고 하면 ‘Unable to verify secret hash for client’ 오류가 발생합니다. 이 문제를 해결하고 싶습니다.
해결 방법
사용자 풀 앱 클라이언트를 클라이언트 암호로 구성할 때는 API의 쿼리 파라미터에 비밀 해시 값을 포함해야 합니다. 비밀 해시 값을 포함하지 않는 경우 Amazon Cognito는 Unable to verify secret hash for client 오류를 반환합니다.
문제를 해결하려면 보안 해시 값을 계산하십시오. 그 후 InitiateAuth 또는 ForgotPassword와 같은 비밀 해시를 허용하는 Amazon Cognito API를 호출할 때 이 값을 포함시키십시오.
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
비밀 해시 값 계산
보안 해시 값을 계산하려면 다음 정보가 있어야 합니다.
- 앱 클라이언트 ID
- 앱 클라이언트 암호
- Amazon Cognito 사용자 풀에 있는 사용자의 사용자 이름
프로세스를 자동화하려면 다음 단계를 완료하십시오.
- Python 웹사이트에서 Windows용 Python의 최신 버전을 다운로드합니다. 그런 다음, 로컬 컴퓨터에 Python을 설치합니다.
- 다음 예제 Python 스크립트를 .py 파일로 저장합니다. 예를 들어 파일을 secret_hash.py로 저장할 수 있습니다. 다음 스크립트는 애플리케이션 클라이언트 암호를 키로 사용하고 SHA256 해시 함수를 사용하여 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}")
참고: username을 사용자 풀에 있는 사용자의 사용자 이름으로 바꿉니다. 또한 app_client_id를 사용자 풀의 앱 클라이언트 ID로 바꾸고 키를 앱 클라이언트의 암호로 바꾸십시오.
- 비밀 해시 값을 가져오려면 다음 명령을 실행합니다.
python3 secret_hash.py username app_client_id app_client_secret
참고: Python 3.0 이전 버전의 Python을 실행 중인 경우, python3을 python으로 바꾸십시오. secret_hash.py를 파일 이름으로, username을 사용자 풀 사용자 이름으로, app_client_id를 앱 클라이언트 ID로, app_client_secret을 앱 클라이언트의 암호로 바꿉니다.
API 직접 호출에 비밀 해시 값 포함
API 직접 호출의 쿼리 문자열 파라미터에 비밀 해시 값을 SECRET_HASH 파라미터로 추가합니다.
SECRET_HASH 파라미터를 포함하는 InitiateAuth API 직접 호출 예시:
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
InitiateAuth API 직접 호출 출력 예시:
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "<HIDDEN>",
"ExpiresIn": 3600,
"TokenType":
"Bearer",
"RefreshToken": "<HIDDEN>",
"IdToken": "<HIDDEN>"
}
}
참고: USER_PASSWORD_AUTH 인증 흐름을 사용하는 경우 앱 클라이언트에 대해 ALLOW_USER_PASSWORD_AUTH를 켜십시오.
SECRET_HASH 파라미터가 포함된 ForgotPassword API 직접 호출 예시:
aws cognito-idp forgot-password --client-id example_client-id --username example_username --secret-hash example_secret-hash
참고: username을 사용자 이름으로 바꾸고 secret-hash를 비밀 해시 값으로 바꾸십시오.
ForgotPassword API 직접 호출 출력의 예:
{
"CodeDeliveryDetails": {
"Destination": "+***********",
"DeliveryMedium": "SMS",
"AttributeName": "phone_number"
}
}