Amazon Cognito ユーザープール API を呼び出そうとすると、「クライアント <client-id> のシークレットのハッシュを検証できません」というエラーが表示されます。どうすればこのエラーを解決できますか?
簡単な説明
ユーザープールのアプリケーションクライアントがユーザープールのクライアントシークレットで設定されている場合、API のクエリ引数に SecretHash 値が必要です。API クエリ引数にシークレットハッシュが指定されていない場合、Amazon Cognito は「クライアント <client-id> のシークレットのハッシュを検証できません」というエラーを返します。
次の例は、SecretHash 値を作成し、それを InitiateAuth または ForgotPassword API 呼び出しに含める方法を示しています。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください。
SecretHash 値を作成するには
SecretHash 値を計算するの手順に従います。アプリケーションのクライアント ID、アプリケーションのクライアントシークレット、Amazon Cognito ユーザープールのユーザーのユーザー名が必要です。
プロセスを自動化するには、次のように操作します。
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"
}
}