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 を実行している場合は、python3python に置き換えます。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"
    }
}

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?