ユーザーアカウントのサインアップと確認 - Amazon Cognito

ユーザーアカウントのサインアップと確認

ユーザーアカウントは次の方法の 1 つでユーザープールに追加されます。

サインアップするユーザーは、サインインする前に確認が求められます。インポートされ作成されたユーザーはすでに確認されていますが、初めてサインインするときはパスワードを作成する必要があります。以下のセクションで、確認プロセス、E メール、電話確認について説明します。

ユーザーアカウント確認の概要

次の図は確認プロセスを示しています。


        ユーザーが確認コードを入力すると、自動的に E メールまたは電話を確認します。

ユーザーアカウントは、以下のいずれかの状態になります。

登録済み (未確認)

ユーザーは正常にサインアップできますが、ユーザーアカウントを確認するまではサインインできません。ユーザーは有効ですが、この状態で確認されていません。

サインアップする新しいユーザーはこの状態から開始します。

確認済み

ユーザーアカウントが確認され、ユーザーはサインインできます。ユーザーが E メールまたは電話 (SMS) (または、E メールの場合確認リンクをクリックして) で受け取った確認コードを入力してユーザーアカウントを確認している場合は、E メールまたは電話番号が自動的に確認されます。コードまたはリンクは 24 時間有効です。

ユーザーアカウントが管理者またはサインアップ前 Lambda トリガーによって確認されている場合、検証済みの E メールまたは電話番号がアカウントに関連付けられていないことがあります。

パスワードのリセットが必要

ユーザーアカウントは確認されましたが、ユーザーはサインインする前にコードをリクエストし、自身のパスワードをリセットする必要があります。

管理者または開発者がインポートしたユーザーアカウントは、この状態から開始します。

パスワードの強制変更

ユーザーアカウントが確認され、ユーザーは一時パスワードを使用してサインインできますが、初回のサインイン時にパスワードを変更して、他の操作を行う前に値を変更できないようにする必要があります。

管理者または開発者が作成したユーザーアカウントは、この状態から開始します。

Disabled

ユーザーアカウントを削除する前に、無効にする必要があります。

サインアップ時に連絡先情報を検証する

新しいユーザーがアプリにサインアップする際、1 つ以上の連絡先の入力を求める必要があります。たとえば、ユーザーの連絡先情報は、以下のように使用されます。

  • ユーザーが自分のパスワードをリセットする際、仮パスワードを送信する。

  • ユーザーの個人情報または財務情報が更新された際に通知する。

  • プロモーションメッセージ (特価販売や割引など) を送信する。

  • アカウントの概要または請求日のお知らせを送信する。

このようなユースケースでは、検証済みの送信先にメッセージを送信することが重要です。そうしないと、誤入力された無効な E メールアドレスまたは電話番号にメッセージが送信される可能性があります。さらに悪いケースでは、ユーザーを騙る悪人に機密情報が送信される可能性があります。

適切なユーザーにのみメッセージが確実に送信されるように、ユーザーのサインアップ時に以下の情報の入力を求めるよう Amazon Cognito ユーザープールを設定します。

  1. E メールアドレスおよび電話番号。

  2. Amazon Cognito より E メールアドレスまたは電話番号に送信される検証コード。

検証コードを入力することで、コードを受信したメールボックスまたは電話へのアクセス権があるユーザーであることが証明されます。ユーザーがコードを入力すると、Amazon Cognito によって、次のようにユーザープールのユーザーに関する情報が更新されます。

  • ユーザーのステータスを CONFIRMED に設定する。

  • ユーザーの属性を更新し、E メールアドレスまたは電話番号が検証されていることを示す。

この情報を表示するには、Amazon Cognito コンソールを使用します。または、AdminGetUser API アクション、AWS CLI を使用した admin-get-user コマンド、またはいずれかの AWS SDK の対応するアクションを使用できます。

ユーザーが連絡方法を検証すると、パスワードリセットのリクエスト時に Amazon Cognito によってユーザーにメッセージが送信されます。

E メールまたは電話による検証を求めるようにユーザープールを設定するには

E メールまたは電話による検証を求めることで、信頼性の高い方法でユーザーに連絡できるようになります。Amazon Cognito コンソールを使用してユーザープールを設定するには、以下のステップを実行します。

開始する前に

アカウントを持っていない場合、アカウントにユーザープールが設定されている必要があります。サービスロールを作成する場合は、「ユーザープールの開始方法。」を参照してください。

ユーザープールを設定するには

  1. AWS マネジメントコンソール にサインインして、https://console.aws.amazon.com/cognito で Amazon Cognito コンソールを開きます。

  2. [ユーザープールの管理] を選択します。

  3. [ユーザープール] ページで、設定するユーザープールを選択します。

  4. 左側のナビゲーションメニューで、[MFA and verifications] を選択します。

    E メールまたは電話による検証のオプションが、[Which attributes do you want to verify?] に表示されます。

    
            ユーザーがアプリにサインアップするための E メールアドレスまたは電話番号を検証する必要があるユーザープール設定オプション。
  5. 次のいずれかのオプションを選択します。

    E メール

    このオプションを選択した場合、ユーザーがサインアップすると、Amazon Cognito より検証コードが送信されます。通常 E メールでユーザーと通信する場合は、このオプションを選択してください。たとえば、請求明細、注文書、特価販売を使用する場合は、検証済みの E メールアドレスを使用する必要があります。

    電話番号

    このオプションを選択した場合、ユーザーがサインアップすると、Amazon Cognito より SMS で検証コードが送信されます。通常 SMS でユーザーと通信する場合は、このオプションを選択してください。たとえば、配信通知、予約確認、または警告を送信する場合は、検証済みの電話番号を使用します。

    E メールまたは電話番号

    すべてのユーザーに同じ検証済みの連絡方法を要求する必要がない場合は、このオプションを選択してください。この場合、アプリのサインアップページで、希望する連絡方法のみを検証するようにユーザーに求めることができます。Amazon Cognito が検証コードを送信すると、そのコードは、アプリの SignUp リクエストで指定された連絡方法に送信されます。ユーザーが E メールアドレスと電話番号の両方を入力し、SignUp リクエストでアプリケーションから両方の連絡先に送信された場合、Amazon Cognito は確認コードをその電話番号にのみ送信します。

    ユーザーに E メールアドレスと電話番号の両方を検証するように要求する場合は、このオプションを選択してください。一方の連絡方法はユーザーのサインアップ時に Amazon Cognito によって検証され、もう一方の連絡方法はサインイン後にアプリで検証されます。詳細については、「ユーザーに E メールアドレスと電話番号の両方の確認を要求する場合」を参照してください。

    なし

    このオプションを選択した場合、検証コードは、ユーザーのサインアップ時に Amazon Cognito より送信されません。Amazon Cognito の検証コードを使用せずに 1 つ以上の連絡方法を検証するカスタムの認証フローを使用している場合は、このオプションを選択します。たとえば、特定のドメインに属する E メールアドレスを自動的に確認するサインアップ前 Lambda トリガーを使用することができます。

    ユーザーの連絡先情報を検証しない場合は、一部のケースでアプリを使用できない場合があります。以下を行うには、ユーザーの連絡情報の検証が必要となる点にご注意ください。

    • パスワードのリセット。ユーザーがアプリで ForgotPassword API アクションを呼び出すアクションを行うと、Amazon Cognito より、ユーザーの E メールアドレスまたは電話番号に仮パスワードが送信されます。このパスワードは、ユーザーが 1 つ以上の連絡方法を検証済みである場合にのみ、Amazon Cognito より送信されます。

    • E メールアドレスまたは電話番号をエイリアスとして使用してサインインします。これらのエイリアスを許可するようにユーザープールを設定した場合、ユーザーは、検証済みである場合にのみ、そのエイリアスを使用してサインインできます。詳細については、「エイリアスの概要」を参照してください。

  6. [Save changes] を選択します。

E メールアドレスまたは電話による検証を使用した認証フロー

ユーザープールで連絡先情報の検証をユーザーに要求する場合、ユーザーがアプリにサインアップした後のフローを容易にする必要があります。

  1. ユーザーは、ユーザー名、メールアドレス、電話番号やその他の属性を入力してアプリにサインアップします。

  2. Amazon Cognito サービスは、アプリからサインアップのリクエストを受け取ります。サインアップに必要なすべての属性がリクエストに含まれることを確認した後で、サービスはサインアッププロセスを完了し、確認コードをユーザーの電話 (SMS 経由で) または E メールに送信 します。コードは 24 時間有効です

  3. サービスは、サインアップが完了しユーザーアカウントが確認保留であることを返します。応答には、確認コードの送信先に関する情報が含まれます。この時点でユーザーアカウントは未確認状態になり、ユーザーのメールアドレスと電話番号は未確認です。

  4. アプリは、ユーザーに確認コードを入力するよう求めるメッセージを表示できます。ユーザーは、コードをすぐに入力する必要はありません。ただし、確認コードを入力するまでユーザーはサインインできません。

  5. ユーザーがアプリに確認コードを入力します。

  6. アプリは ConfirmSignUp を呼び出してコードを Amazon Cognito サービスに送信します。これにより、コードが検証され、コードが正しければ、ユーザーのアカウントは、確認済み状態に設定されます。正常にユーザーアカウントを確認した後で、Amazon Cognito サービスは確認 (E メールまたは電話番号) で使用して確認済みとするための属性を自動的にマーキングします。この属性の値が変更されていない場合、ユーザーはそれを再度確認する必要はありません。

  7. この時点で、ユーザーアカウントは確認済みの状態になっており、ユーザーはサインインできます。

ユーザーに E メールアドレスと電話番号の両方の確認を要求する場合

ユーザーがサインアップすると、Amazon Cognito によって、いずれかの連絡方法のみ検証されます。Amazon Cognito で E メールアドレスまたは電話番号の選択が必要な場合は、SMS 経由で検証コードを送信して、電話番号を検証する必要があります。たとえば、E メールアドレスと電話番号のいずれかを検証することをユーザーに許可するようにユーザープールを設定する場合や、アプリへのサインアップ時にこれらの連絡方法の両方の検証を求める場合、Amazon Cognito は電話番号のみ検証します。ユーザーが電話番号を検証したら、Amazon Cognito はユーザーのステータスを CONFIRMED に設定します。これで、ユーザーはアプリにサインインできるようになります。

ユーザーがアプリにサインインした後、サインアップ時に検証されなかった連絡方法を検証するオプションを提示することができます。この 2 つ目の方法を検証するには、アプリで VerifyUserAttribute API アクションを呼び出します。このアクションでは、AccessToken パラメータを使用します。Amazon Cognito によって、認証されたユーザーのアクセストークンのみが付与されます。したがって、2 つ目の連絡方法は、ユーザーがサインインした後にのみ検証できます。

E メールアドレスと電話番号の両方を検証するようにユーザーに求める場合は、以下のように行います。

  1. E メールアドレスまたは電話番号を検証することをユーザーに許可するようにユーザープールを設定します。

  2. アプリのサインアップフローで、E メールアドレスおよび電話番号の両方を入力するようユーザーに求めます。SignUp API アクションを呼び出し、UserAttributes パラメータの E メールアドレスおよび電話番号を指定します。この時点で、Amazon Cognito よりユーザーの携帯電話に検証コードが送信されます。

  3. アプリのインターフェイスで、ユーザーが検証コードを入力する確認ページを提示します。ユーザーを確認するには、ConfirmSignUp API アクションを呼び出します。この時点で、ユーザーのステータスは CONFIRMED となり、ユーザーの電話番号は検証されますが、E メールアドレスはまだ検証されていません。

  4. サインインページを提示し、ユーザーを認証するには、InitiateAuth API アクションを呼び出します。ユーザーが認証されると、アクセストークンが Amazon Cognito よりアプリに返ります。

  5. GetUserAttributeVerificationCode API アクションを呼び出します。リクエストで次のパラメータを指定します。

    • AccessToken – ユーザーのサインイン時に Amazon Cognito より返るアクセストークン。

    • AttributeName"email" を属性値として指定します。

    Amazon Cognito より、検証コードがユーザーの E メールアドレスに送信されます。

  6. ユーザーが検証コードを入力する確認ページを提示します。ユーザーがコードを入力したら、VerifyUserAttribute API アクションを呼び出します。リクエストで次のパラメータを指定します。

    • AccessToken – ユーザーのサインイン時に Amazon Cognito より返るアクセストークン。

    • AttributeName"email" を属性値として指定します。

    • Code – ユーザーが入力した検証コード。

    この時点で、E メールアドレスが検証されます。

ユーザーにアプリへのサインアップを許可するが管理者として確認する

  1. ユーザーは、ユーザー名、メールアドレス、電話番号やその他の属性を入力してアプリにサインアップします。

  2. Amazon Cognito サービスは、アプリからサインアップのリクエストを受け取ります。サインアップに必要なすべての属性がリクエストに含まれることを確認した後で、サービスはサインアッププロセスを完了し、アプリにサインアップが完了し確認が保留中であることをアプリに返します。この時点でユーザーのアカウントは未確認状態です。アカウントが確認されるまで、ユーザーはサインインすることはできません。

  3. 管理者は Amazon Cognito コンソール ([ユーザー] タブでユーザーアカウントを見つけて [確認] ボタンを押して) または CLI (admin-confirm-sign-up コマンドを使用して) のいずれかでユーザーのアカウントを確認します。[確認] ボタンと admin-confirm-sign-up コマンドは、AdminConfirmSignUp API を使用して確認を行います。

  4. この時点で、ユーザーアカウントは確認済みの状態になっており、ユーザーはサインインできます。

SecretHash 値の計算

次の Amazon Cognito ユーザープール API には、SecretHash パラメータがあります。

SecretHash 値は、Base 64 でエンコードされたキーつきハッシュメッセージ認証コード (HMAC) であり、ユーザープールクライアントおよびユーザー名、さらにメッセージ内のクライアント ID を使用して計算されたものです。次の擬似コードは、この値の計算方法を示します。この擬似コードで + は連結を表し、HMAC_SHA256 は HmacSHA256 を使用して HMAC 値を生成する関数を、Base64 は Base-64 でエンコードされたバージョンのハッシュ出力を生成する関数を示します。

Base64 ( HMAC_SHA256 ( "Client Secret Key", "Username" + "Client Id" ) )

また、サーバー側の Java アプリケーションコードで、次のコード例を使用することもできます。

import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public static String calculateSecretHash(String userPoolClientId, String userPoolClientSecret, String userName) { final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; SecretKeySpec signingKey = new SecretKeySpec( userPoolClientSecret.getBytes(StandardCharsets.UTF_8), HMAC_SHA256_ALGORITHM); try { Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); mac.init(signingKey); mac.update(userName.getBytes(StandardCharsets.UTF_8)); byte[] rawHmac = mac.doFinal(userPoolClientId.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(rawHmac); } catch (Exception e) { throw new RuntimeException("Error while calculating "); } }

E メールまたは電話番号の確認なしでユーザーアカウントを確認する

サインアップ前 Lambda トリガーを使用して、サインアップ時に確認コードまたは E メールまたは電話番号なしでユーザーアカウントを自動確認できます。この方法で確認されたユーザーは、コードを受け取らないですぐにサインインできます。

このトリガーによって検証されたユーザーのメールまたは電話番号をマーキングすることもできます。

注記

これはユーザーが始めるにあたって便利な方法ですが、E メールまたは電話番号を少なくとも 1 つ自動検証することをお勧めします。そうしないと、ユーザーがパスワードを忘れた際に復旧できないままになる場合があります。

ユーザーのサインアップ時に確認コードの受信と入力を求めず、サインアップ前 Lambda トリガーでメールや電話番号を自動検証しない場合、そのユーザーアカウントには検証済みの E メールアドレスまたは電話番号がないリスクがあります。ユーザーはメールアドレスまたは電話番号を後で確認できます。ただし、パスワードを忘れて確認済みのメールアドレスまたは電話番号がない場合、パスワードを忘れた場合のフローで検証コードをユーザーに送信するために確認済みのメールアドレスまたは電話番号が必要となるため、ユーザーはアカウントからロックアウトされます。

ユーザーが E メールまたは電話番号を変更するときに確認する

ユーザーがアプリ内で自身のメールアドレスまたは電話番号を変更すると、その属性が未検証としてマークされます。更新された属性に対して自動検証が有効になっていた場合は、サービスによって即時に検証コードが含まれるメッセージがユーザーに送信され、ユーザーはそのコードを入力して変更を確認します。カスタムメッセージ Lambda トリガーを使用してこのメッセージをカスタマイズできます。詳細については、「Lambda トリガーを使用したユーザープールワークフローのカスタマイズ」を参照してください。ユーザーのメールアドレスまたは電話番号が未確認の場合、アプリは未確認のステータスを表示し、ユーザーが新しい E メールまたは電話番号を確認するためのボタンまたはリンクを提供する必要があります。

管理者または開発者が作成するユーザーアカウントの確認および検証プロセス

管理者または開発者が作成したユーザーアカウントは常に確認済み状態にあるため、ユーザーは確認コードを入力する必要はありません。Amazon Cognito サービスがこれらのユーザーに送信する招待メッセージには、ユーザー名と一時パスワードが含まれています。ユーザーは、サインインする前にパスワードを変更する必要があります。詳細について、は、「[Message Customizations] タブ」の「管理者としてのユーザーアカウントの作成」と「Lambda トリガーを使用したユーザープールワークフローのカスタマイズ」のカスタムメッセージのトリガーを参照してください。

インポート済みユーザーアカウントの確認および検証プロセス

AWS マネジメントコンソール、CLI、または API (「CSV ファイルからユーザープールへのユーザーのインポート」を参照) でユーザーのインポート機能を使用して作成されたユーザーアカウントは常に確認済み状態にあるため、ユーザーは確認コードを入力する必要はありません。招待メッセージは送信されません。ただし、インポートされたユーザーアカウントでは、サインインする前にまず ForgotPassword API を呼び出してコードをリクエストし、次に提供されたコードを使用して ConfirmForgotPassword API を呼び出しパスワードを作成する必要があります。詳細については、「インポートされたユーザーにパスワードをリセットするように要求」を参照してください。

ユーザーアカウントがインポートされたときに、ユーザーの E メールまたは電話番号は確認済みとしてマークする必要があります。したがって、ユーザーがサインインする際に認証は必要ありません。

アプリのテスト中に E メールを送信する

ユーザープールのクライアントアプリでアカウントを作成および管理する場合、Amazon Cognito よりユーザーに E メールが送信されます。E メールの検証を求めるようにユーザープールを設定した場合は、以下のタイミングで Amazon Cognito より E メールが送信されます。

  • ユーザーのサインアップ時。

  • ユーザーが E メールアドレスを更新する際。

  • ユーザーが ForgotPassword API アクションを呼び出すアクションを実行する際。

  • 管理者としてユーザーアカウントを作成する際。

E メールを開始するアクションに応じて、検証コードまたは仮パスワードが含まれます。ユーザーは、これらの E メールを受け取り、メッセージを理解する必要があります。そうしないと、アプリにサインインして使用できない場合があります。

E メールが正しく送信され、メッセージが正しく表示されていることを確認するには、Amazon Cognito からの E メールの配信を行うアクションをアプリでテストします。たとえば、アプリでサインアップページを使用するか、SignUp API アクションを使用して、テスト用メールアドレスでサインアップすることで E メールを配信できます。この方法でテストする場合は、次の点に注意してください。

重要

Amazon Cognito から E メールを送信するアクションをテストするために E メールアドレスを使用する場合は、偽の E メールアドレス (メールボックスの存在しないメールアドレス) は使用しないでください。ハードバウンス を作成せずに、Amazon Cognito から E メールを受け取る実際のメールアドレスを使用します。

ハードバウンスは、Amazon Cognito から受取人のメールボックスにメールを配信できない場合に発生します。メールボックスが存在しない場合には常に発生します。

Amazon Cognito では、ハードバウンスが永続的に発生する AWS アカウントから送信できる E メールの数に制限があります。

E メールを配信するアクションをテストする場合、次のいずれかの E メールアドレスを使用してハードバウンスを回避します。

  • テスト用に所有し、使用している E メールアカウントのメールアドレス。自分の E メールアドレスを使用すると、Amazon Cognito からの E メールが送信されます。この E メールでは、検証コードを使用して、アプリのサインアップエクスペリエンスをテストできます。ユーザープールの E メールメッセージをカスタマイズした場合は、正しく表示されていることを確認します。

  • メールボックスシミュレーターのアドレス (success@simulator.amazonses.com)。シミュレーターのアドレスを使用した場合、メールは Amazon Cognito から正しく送信されますが、表示することはできません。このオプションは、検証コードを使用する必要がなく、E メールのメッセージを確認する必要がない場合に役立ちます。

  • 任意のラベルを追加したメールボックスシミュレーターのアドレス (例: success+user1@simulator.amazonses.com または success+user2@simulator.amazonses.com)。E メールは、Amazon Cognito よりこれらのアドレスに正しく送信されますが、送信されたメールを表示することはできません。このオプションは、複数のテストユーザーをユーザープールに追加してサインアッププロセスをテストし、各テストユーザーに一意の E メールアドレスがある場合に便利です。