ユーザー存在エラー応答の管理 - Amazon Cognito

ユーザー存在エラー応答の管理

Amazon Cognito は、ユーザープールから返されるエラーレスポンスのカスタマイズをサポートしています。カスタムエラーレスポンスは、ユーザーの作成と認証、パスワードリカバリ、および確認操作に利用できます。

ユーザープールアプリクライアントの PreventUserExistenceErrors 設定を使用して、ユーザーの存在に関連するエラーを有効または無効にします。新しいユーザープールを作成すると、PreventUserExistenceErrors はデフォルトで false になります。この値が true の場合、Amazon Cognito は API リクエストに対して非特定の情報で応答します。そうしない場合、その応答から有効なユーザーが存在することが明らかになる可能性があります。Amazon Cognito API で、UpdateUserPoolClient リクエストを使用してこの値を更新します。AWS Management Console で、アプリケーションクライアントを作成または編集して、ユーザー存在エラーを防ぐを有効にします。

ユーザープールでユーザー存在エラーを防ぐと、Amazon Cognito 認証 API は認証失敗の汎用レスポンスを返します。エラーレスポンスは、ユーザー名またはパスワードが正しくないことを伝えます。Amazon Cognito のアカウント確認 API とパスワードリカバリ API は、コードがシミュレートされた配信メディアに送信されたことを示すレスポンスを返します。エラーレスポンスは、ステータスが ENABLED であり、ユーザーが存在しないときに機能します。以下は、PreventUserExistenceErrorsENABLED に設定されている場合の Amazon Cognito 操作の詳細な動作です。

ユーザー作成と認証オペレーション

次のオペレーションでは、ユーザー名パスワード認証またはセキュアリモートパスワード (SRP) 認証のいずれかを使用できます。カスタム認証で返すエラーをカスタマイズすることもできます。

  • AdminInitiateAuth

  • AdminRespondToAuthChallenge

  • InitiateAuth

  • RespondToAuthChallenge

次のリストは、ユーザー認証オペレーションのエラーレスポンスをカスタマイズする方法を示しています。

ユーザー名およびパスワード認証

ADMIN_USER_PASSWORD_AUTH および USER_PASSWORD_AUTH でユーザーをサインインするには、ユーザー名とパスワードを AdminInitiateAuth または InitiateAuth API リクエストに含めます。Amazon Cognito は、ユーザー名またはパスワードが正しくない場合、汎用 NotAuthorizedException エラーを返します。

セキュアリモートパスワード (SRP) ベースの認証

USER_SRP_AUTH でユーザーをサインインするには、AdminInitiateAuth または InitiateAuth API リクエストにユーザー名と SRP_A パラメータを含めます。それに応じて、Amazon Cognito は、SRP 標準に従って、SRP_B とソルトをユーザーに返します。ユーザーが見つからない場合、RFC 5054 で説明されているように、Amazon Cognito は最初のステップでシミュレートされたレスポンスを返します。Amazon Cognito は、同じユーザー名とユーザープールの組み合わせに対して、同じ salt と汎用一意識別子 (UUID) 形式の内部ユーザー ID を返します。パスワードの証明を含む RespondToAuthChallenge API リクエストを送信すると、Amazon Cognito はユーザー名またはパスワードのいずれかが正しくない場合に一般的な NotAuthorizedException エラーを返します。

注記

検証ベースのエイリアス属性を使用していて、変更不可能なユーザー名の形式が UUID でない場合は、ユーザー名とパスワードの認証で汎用レスポンスをシミュレートできます。

カスタム認証チャレンジの Lambda トリガー

カスタム認証チャレンジの Lambda トリガーを使用しており、エラーレスポンスを有効にする場合は、LambdaChallengeUserNotFound という名前のブールパラメータを返します。その後、それが DefineAuthChallengeVerifyAuthChallenge、および CreateAuthChallenge Lambda トリガーのリクエストに渡されます。このトリガーを使用して、存在しないユーザーのカスタム認証チャレンジをシミュレートできます。存在しないユーザーに対して事前認証の Lambda トリガーを呼び出す場合、Amazon Cognito は UserNotFound を返します。

次のリストは、ユーザー作成オペレーションのエラーレスポンスをカスタマイズする方法を示しています。

SignUp

SignUp 操作は、ユーザー名がすでに使用されている場合に UsernameExistsException を返します。アプリケーションでユーザーをサインアップするときに Amazon Cognito が E メールアドレスと電話番号の UsernameExistsException エラーを返さないようにするには、検証ベースのエイリアス属性を使用してください。エイリアスの詳細については、ユーザープール属性の「エイリアス」セクションを参照してください。

Amazon Cognito がSignUp API リクエストを使用してユーザープール内のユーザーを検出できないようにする方法の例については、「サインアップ時のメールアドレスと電話番号の UsernameExistsException エラーの防止」を参照してください。

インポート済みユーザー

PreventUserExistenceErrors が有効になっている場合は、インポートされたユーザーの認証中、PasswordResetRequiredException を返す代わりに、ユーザー名またはパスワードが正しくなかったことを示す NotAuthorizedException エラーが返されます。詳細については、「インポートされたユーザーに対するパスワードのリセットの要求」を参照してください。

ユーザー移行の Lambda トリガー

Lambda トリガーによって元のイベントコンテキストに空のレスポンスが設定された場合、Amazon Cognito は存在しないユーザーについてシミュレートされたレスポンスを返します。詳細については、「ユーザー移行の Lambda トリガー」を参照してください。

サインアップ時のメールアドレスと電話番号の UsernameExistsException エラーの防止

次の例は、ユーザープールでエイリアス属性を設定するときに、重複する E メールアドレスと電話番号が SignUp API リクエストに応答して UsernameExistsException エラーを生成しないようにする方法を示しています。E メールアドレスまたは電話番号をエイリアス属性として使用してユーザープールを作成しておく必要があります。詳細については、ユーザープール属性の「エイリアス」セクションを参照してください。

  1. Jie は新しいユーザー名にサインアップし、E メールアドレス jie@example.com も提供します。Amazon Cognito がユーザーの E メールアドレスにコードを送信します。

    AWS CLI コマンドの例

    aws cognito-idp sign-up --client-id 1234567890abcdef0 --username jie --password PASSWORD --user-attributes Name="email",Value="jie@example.com"

    レスポンスの例

    { "UserConfirmed": false, "UserSub": "<subId>", "CodeDeliveryDetails": { "AttributeName": "email", "Destination": "j****@e****", "DeliveryMedium": "EMAIL" } }
  2. Jie は、E メールアドレスの所有権を確認するために送信されたコードを提供します。これで、ユーザーとしての登録は完了です。

    AWS CLI コマンドの例

    aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=jie --confirmation-code xxxxxx
  3. Shirley は新しいユーザーアカウントを登録し、E メールアドレス jie@example.com を提供します。Amazon Cognito は UsernameExistsException エラーを返さず、確認コードを Jie の E メールアドレスに送信します。

    AWS CLI コマンドの例

    aws cognito-idp sign-up --client-id 1234567890abcdef0 --username shirley --password PASSWORD --user-attributes Name="email",Value="jie@example.com"

    レスポンスの例

    { "UserConfirmed": false, "UserSub": "<new subId>", "CodeDeliveryDetails": { "AttributeName": "email", "Destination": "j****@e****", "DeliveryMedium": "EMAIL" } }
  4. 別のシナリオでは、Shirley が jie@example.com の所有権を持っています。Shirley は Amazon Cognito が Jie の E メールアドレスに送信したコードを取得し、アカウントの確認を試みます。

    AWS CLI コマンドの例

    aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=shirley --confirmation-code xxxxxx

    レスポンスの例

    An error occurred (AliasExistsException) when calling the ConfirmSignUp operation: An account with the email already exists.

jie@example.com が既存のユーザーに割り当てられているにもかかわらず、Amazon Cognito は Shirley の aws cognito-idp sign-up リクエストにエラーを返しません。Amazon Cognito がエラーレスポンスを返す前に、Shirley は E メールアドレスの所有権を証明する必要があります。エイリアス属性を持つユーザープールでは、この動作により、パブリック SignUp API を使用して、特定の E メールアドレスまたは電話番号を持つユーザーが存在するかどうかを確認できなくなります。

この動作は、次の例に示すように、Amazon Cognito が既存のユーザー名の SignUp リクエストに対して返すレスポンスとは異なります。Shirley はこのレスポンスから、そのユーザー名 jie を持つユーザーが既に存在することを知っていますが、そのユーザーに関連する E メールアドレスや電話番号については知りません。

CLI コマンドの例

aws cognito-idp sign-up --client-id 1example23456789 --username jie --password PASSWORD --user-attributes Name="email",Value="shirley@example.com"

レスポンスの例

An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists

パスワードのリセットオペレーション

ユーザー存在エラーを防ぐと、Amazon Cognito は、ユーザーパスワードのリセット操作に対して以下の応答を返します。

ForgotPassword

ユーザーが見つからない、非アクティブ化されている、またはパスワードを回復するための検証済みの配信メカニズムがない場合、Amazon Cognito はそのユーザーについてシミュレート済みの配信ミディアムを用いた CodeDeliveryDetails を返します。シミュレートされた配信メディアは、入力ユーザー名形式とユーザープールの検証設定に応じて決定されます。

ConfirmForgotPassword

Amazon Cognito は、存在しない、または無効になっているユーザーについて CodeMismatchException エラーを返します。ForgotPassword の使用時にコードが要求されない場合、Amazon Cognito は ExpiredCodeException エラーを返します。

確認オペレーション

ユーザー存在エラーを防ぐと、Amazon Cognito は、ユーザーの確認および検証の操作に対して以下の応答を返します。

ResendConfirmationCode

Amazon Cognito は、無効化されたユーザー、または存在しないユーザーについて CodeDeliveryDetails を返します。Amazon Cognito は、既存ユーザーの E メールまたは電話番号に確認コードを送信します。

ConfirmSignUp

コードの有効期限が切れている場合は、ExpiredCodeException が返されます。Amazon Cognito は、ユーザーが承認されていない場合に NotAuthorizedException を返します。コードがサーバーが期待するものと一致しない場合、Amazon Cognito は CodeMismatchException を返します。