Amazon Cognito 사용자 풀 API를 호출하려고하면 “<client-id> 클라이언트의 보안 암호 해시를 확인할 수 없습니다.” 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?
간략한 설명
사용자 풀 앱 클라이언트가 사용자 풀에 클라이언트 보안 암호가 있는 상태로 구성된 경우 API의 쿼리 인수에 SecretHash 값이 필요합니다. API 쿼리 인수에 보안 암호 해시가 제공되지 않으면 Amazon Cognito는 [<client-id> 클라이언트의 보안 암호 해시를 확인할 수 없습니다.(Unable to verify secret hash for client <client-id>)]라는 오류를 반환합니다.
다음 예에서는 SecretHash 값을 생성하여 InitiateAuth 또는 ForgotPassword API 호출에 포함하는 방법을 보여 줍니다.
해결 방법
참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.
SecretHash 값을 생성하려면
SecretHash 값 계산의 지침을 따르세요. Amazon Cognito 사용자 풀에 앱 클라이언트 ID, 앱 클라이언트 보안 암호 및 사용자의 사용자 이름이 필요합니다.
-또는-
프로세스를 자동화하려면 다음을 수행합니다.
1. 아직 설치하지 않았다면 Python을 설치합니다.
2. 다음 예제 Python 스크립트를 .py 파일로 저장합니다.
import sys
import hmac, hashlib, base64
username = sys.argv[1]
app_client_id = sys.argv[2]
key = sys.argv[3]
message = bytes(sys.argv[1]+sys.argv[2],'utf-8')
key = bytes(sys.argv[3],'utf-8')
secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()
print("SECRET HASH:",secret_hash)
참고: 예제 스크립트를 실행하기 전에 다음 값을 바꿉니다. username에 사용자 풀에 있는 사용자의 사용자 이름을 입력합니다. app_client_id에 사용자 풀의 앱 클라이언트 ID를 입력합니다. key에 앱 클라이언트의 보안 암호를 입력합니다.
3. 다음 명령을 실행하여 스크립트를 실행합니다.
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에 앱 클라이언트의 보안 암호를 입력합니다.
명령 응답에 SecretHash 값이 반환됩니다.
API 호출에 SecretHash 값을 포함하려면
참고: 앱 클라이언트가 앱 클라이언트 보안 암호를 사용하여 구성되지 않은 경우 Amazon Cognito API 호출에 SecretHash 값이 필요하지 않습니다. 자세한 내용은 사용자 풀 앱 클라이언트 구성을 참조하세요.
API 호출의 쿼리 문자열 파라미터에 SECRET_HASH 파라미터로 생성한 SecretHash 값을 추가합니다.
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 <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 <client-id> --username <username> --secret-hash <secret-hash>
ForgotPassword API 호출 응답의 예
{
"CodeDeliveryDetails": {
"Destination": "+***********",
"DeliveryMedium": "SMS",
"AttributeName": "phone_number"
}
}