Amazon Cognito ユーザープール API から「クライアント <client-id> のシークレットのハッシュを検証できません」というエラーをトラブルシューティングするにはどうすればよいですか?
最終更新日: 2021 年 4 月 5 日
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"
}
}