Amazon Cognito ユーザープール API を呼び出そうとすると、クライアントのシークレットハッシュを検証できないことを示すエラーが発生するため、この問題をトラブルシューティングしたいです。
解決策
ユーザープールのアプリクライアントをクライアントシークレットとして設定する場合、API のクエリパラメーターにシークレットハッシュ値を含める必要があります。シークレットハッシュ値が含まれていない場合、Amazon Cognito は「クライアントのシークレットハッシュを確認できません」というエラーを返します。
この問題を解決するには、シークレットハッシュ値を計算します。その後、InitiateAuth や ForgotPassword などのシークレットハッシュを受け入れる Amazon Cognito API を呼び出すときに、その値を指定します。
注: AWS コマンドラインインターフェイス (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 に、key はアプリクライアントのシークレットに置き換えます。
- シークレットハッシュ値を取得するには、次のコマンドを実行します。
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 コールに含める
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"
}
}