Amazon Cognito ユーザープール API から返される、クライアントのシークレットハッシュを検証できないことを示すエラーのトラブルシューティング方法を教えてください。

所要時間2分
0

Amazon Cognito ユーザープール API を呼び出そうとすると、クライアントのシークレットハッシュを検証できないことを示すエラーが発生するため、この問題をトラブルシューティングしたいです。

解決策

ユーザープールのアプリクライアントをクライアントシークレットとして設定する場合、API のクエリパラメーターにシークレットハッシュ値を含める必要があります。シークレットハッシュ値が含まれていない場合、Amazon Cognito は「クライアントのシークレットハッシュを確認できません」というエラーを返します。

この問題を解決するには、シークレットハッシュ値を計算します。その後、InitiateAuthForgotPassword などのシークレットハッシュを受け入れる Amazon Cognito API を呼び出すときに、その値を指定します。

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

シークレットハッシュ値を計算する

シークレットハッシュ値を計算するには、次の情報が必要です。

  • アプリのクライアント ID
  • アプリのクライアントシークレット
  • Amazon Cognito ユーザープール内のユーザーのユーザー名

このプロセスを自動化するには、次の手順を実行します。

  1. Python のウェブサイトから Windows 版 Python の最新バージョンをダウンロードします。次に、ローカルマシンに Python をインストールします。
  2. 次の 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 はアプリクライアントのシークレットに置き換えます。
  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 コールに含める

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"
    }
}
コメントはありません

関連するコンテンツ