Amazon Cognito ユーザープール API から発生する「Unable to verify secret hash for client <client-id>」というエラーをトラブルシューティングする方法を教えてください。

所要時間2分
0

Amazon Cognito ユーザープール API を呼び出そうとすると、「Unable to verify secret hash for client <client-id>」というエラーが表示されます。どうすればこのエラーを解決できますか?

簡単な説明

ユーザープールアプリクライアントがユーザープールのクライアントシークレットで設定されている場合、API のクエリ引数に SecretHash 値が必要です。API のクエリ引数にシークレットハッシュが指定されていない場合、Amazon Cognito はクライアントに「Unable to verify secret hash for client <client-id>」エラーを返します。

次の例は、SecretHash 値を作成し、その値を InitiateAuth または ForgotPassword API コールのいずれかに含める方法を示しています。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーを受け取った場合は、使用しているのが最新の AWS CLI バージョンであるをことを確認してください

SecretHash 値を作成するには

Computing SecretHash values」の指示に従ってください。アプリクライアント 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 を実行している場合は、python3python に置き換えます。secret_hash.py には、サンプルスクリプトのファイル名を入力します。username には、ユーザープールのユーザー名を入力します。app_client_id には、お使いのアプリクライアント ID を入力します。app_client_secret には、アプリクライアントのシークレットを入力します。

コマンドレスポンスが SecretHash 値を返します。

SecretHash 値を API コールに含めるには

注: お使いのアプリクライアントがアプリクライアントシークレットで設定されていない場合、Amazon Cognito API コールに SecretHash 値は必要ありません。詳細については、「Configuring a user pool app client」を参照してください。

SECRET_HASH パラメータとして作成した SecretHash 値を API コールのクエリ文字列パラメータに追加します。

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"
    }
}

AWS公式
AWS公式更新しました 3年前
コメントはありません