メニュー
Amazon Cognito
開発者ガイド

チュートリアル: Android アプリのユーザープールを統合する

このチュートリアルでは、Amazon Cognito ユーザープールを Android アプリケーションに統合するための主要なステップの概要を示します。アプリケーションでユーザープールを使用する方法を示す完全なサンプルアプリケーションについては、GitHub ウェブサイトで「Amazon Cognito Your User Pools sample」を参照してください。

ステップ 1: コンソールを使用してアプリのユーザープールをコンソールを作成する

以下の手順では、ユーザープールを作成してアプリで使用する方法を説明します。この手順では、デフォルトの設定を使用してプール ID、アプリのクライアント ID、アプリのクライアントシークレットを作成します。これらの設定のカスタマイズについては、「AWS マネジメントコンソールでの Amazon Cognito ユーザープール設定ステップ」を参照してください。

アプリのユーザープールを作成するには

  1. Amazon Cognito コンソールにサインインします。

  2. [Manage your User Pools] を選択します。

  3. [Create a User Pool] を選択します。

  4. [Pool name] で、プールの名前を入力して [Review defaults] を選択します。これにより、デフォルト設定でプールが作成されます。

  5. 左のナビゲーションペインから、[Attributes] を選択し、必要な属性とエイリアスとして使用する属性を指定します。次の属性を設定した後、プール内のユーザーがメールアドレスを確認すると、それらのユーザーは自分のユーザー名またはメールアドレスを使用してサインインできます。

    1. [email] で、[Required] と [Alias] を選択します。

    2. [phone number] で、[Required] と [Alias] を選択します。

    3. [given name] で、[Required] を選択します。

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

  6. 左のナビゲーションペインから、[Policies] を選択してパスワードポリシーを指定します。このチュートリアルでは、デフォルト設定を使用します。

  7. 左のナビゲーションペインから、[Verifications] を選択します。このページでは、プール内のユーザーに送信されるメッセージをカスタマイズして確認コードを配信できます。このチュートリアルでは、デフォルト設定を使用します。

  8. 左のナビゲーションペインから、[Apps] を選択し、[Add an app] を選択します。ユーザープールに複数のアプリクライアントを作成し、プラットフォームごとに 1 つのアプリを作成できます。

  9. [App name] に、アプリの名前を入力します。[Generate app client secret] をオンにしたまま、[Set attribute read and write permissions] を選択します。書き込み権限が必要な属性を選択します。必要な属性は、常に書き込み権です。

  10. [Create app] を選択し、[Save changes] を選択します。

  11. 左のナビゲーションバーから、[Review] を選択して [Create pool] を選択します。

  12. [Pool ID]、[Pool ARN]、[App client ID]、および [App client secret] を書き留めます。左のナビゲーションバーにある [Apps] にアプリのクライアント ID とアプリのクライアントシークレットが表示されます。クライアントシークレットを表示するには、[Show details] を選択します。

ステップ 2: ユーザープールオブジェクトを作成する

ユーザープールオブジェクトを作成するには、プール ID、クライアント ID、クライアントシークレットが必要です。以下の例では、ClientConfiguration オブジェクトと CognitoUserPool オブジェクトを作成する方法を示します。CognitoUserPool オブジェクトは、アプリケーションから行われるユーザープールとのすべてのやり取りのエントリポイントです。サンプルアプリケーションでは、userPoolAppHelper.java で作成されます。

ClientConfiguration clientConfiguration = new ClientConfiguration(); // Create a CognitoUserPool object to refer to your user pool CognitoUserPool userPool = new CognitoUserPool(context, poolId, clientId, clientSecret, clientConfiguration);

ステップ 3: アプリ用にユーザーをサインアップする

以下のステップでは、ユーザーをアプリにサインアップする方法を説明します。

ユーザーをアプリにサインアップするには

  1. ユーザーから以下の情報を収集します。

    • ユーザー ID: これは、ユーザーがログインに使用します。プール内で一意である必要があります。

    • パスワード: これは、ユーザーのパスワードです。

    • ユーザー属性: プールの必須属性 (E メール、指定された名前、電話番号) を指定する必要があります。

  2. プールインスタンスを使用して、ユーザーをサインアップします。

    // Create a CognitoUserAttributes object and add user attributes CognitoUserAttributes userAttributes = new CognitoUserAttributes(); // Add the user attributes. Attributes are added as key-value pairs // Adding user's given name. // Note that the key is "given_name" which is the OIDC claim for given name userAttributes.addAttribute("given_name", userGivenName); // Adding user's phone number userAttributes.addAttribute("phone_number", phoneNumber); // Adding user's email address userAttributes.addAttribute("email", emailAddress);
  3. サインアップのコールバックハンドラーを作成します。onSuccess メソッドは、サインアップに成功すると呼び出されます。

    SignUpHandler signupCallback = new SignUpHandler() { @Override public void onSuccess(CognitoUser cognitoUser, boolean userConfirmed, CognitoUserCodeDeliveryDetails cognitoUserCodeDeliveryDetails) { // Sign-up was successful // Check if this user (cognitoUser) needs to be confirmed if(!userConfirmed) { // This user must be confirmed and a confirmation code was sent to the user // cognitoUserCodeDeliveryDetails will indicate where the confirmation code was sent // Get the confirmation code from user } else { // The user has already been confirmed } } @Override public void onFailure(Exception exception) { // Sign-up failed, check exception for the cause } };
  4. サインアップ API を呼び出します。

    userPool.signUpInBackground(userId, password, userAttributes, null, signupCallback);

ステップ 4: アプリ用のユーザーを確認する

ユーザーがサインアップしてからサインインする前に、ユーザーの確認が求められることがあります。ユーザーは、E メールまたは電話を通して確認できます。サインアップに成功すると、ユーザーの確認が必要な場合は、ユーザーの E メールアドレスまたは電話番号に確認コードが送信されます。Lambda トリガーを使用したサインアップの後、ユーザーを自動的に確認することもできます。

ユーザーがサインアップ時に E メールアドレスまたは電話番号を指定した場合に、ユーザープールの自動確認を選択すると、確認コードがユーザーの電話番号にテキストメッセージとして送信されるか、E メールアドレスに送信されます。サインアップが成功した後にコールバックハンドラーとして送信された cognitoUserCodeDeliveryDetails オブジェクトは、この確認コードが送信された場所を示しています。これを使用すると、確認コードの入手方法をユーザーに知らせることができます。

以下のステップでは、ユーザーがアプリにサインインする前にユーザー情報を確認する方法について説明します。

アプリのユーザーを確認するには

  1. ユーザーを確認するためのコールバックハンドラーを作成します。このコールバックハンドラーは、確認 API コールの結果を知らせるために SDK によって使用されます。

    // Callback handler for confirmSignUp API GenericHandler confirmationCallback = new GenericHandler() { @Override public void onSuccess() { // User was successfully confirmed } @Override public void onFailure(Exception exception) { // User confirmation failed. Check exception for the cause. } };
  2. 新しいユーザーが確認されると、確認コードの送信に使用されたユーザーの属性 (E メールアドレスまたは電話番号) が確認済みとマークされます。この属性がエイリアスとしても使用されるように設定されている場合、ユーザーはユーザー名の代わりにその属性 (E メールアドレスまたは電話番号) を使用してサインインできます。

ステップ 5: エイリアス値の競合を解決する

エイリアス値は、プール内で一意にする必要があります。新しいユーザーを確認したとき、そのユーザーの E メールアドレスまたは電話番号がエイリアスとして使用されていて、その E メールまたは電話番号が既にプール内の既存のユーザーに使用されている場合、この競合を解決する必要があります。一意性を確保するには、次のいずれかを実行します。

  • forcedAliasCreation パラメーターを false に設定します。これにより、ユーザーの確認が失敗して競合が解決されます。既存のユーザーの属性は確認済みのままで、引き続き既存のユーザーのエイリアスとなります。新しいユーザーは、次の例に示すように未確認のままです。

    // This will cause confirmation to fail if the user attribute has been verified for another user in the same pool boolean forcedAliasCreation = false; // Call API to confirm this user cognitoUser.confirmSignUpInBackground(confirmationCode, forcedAliasCreation, confirmationCallback);
  • forcedAliasCreation パラメーターを true に設定すると、新しいユーザーの属性 (E メールまたは電話番号) が確認済みとマークされ、その結果既存のユーザーが未確認とマークされるため、競合が解決されます。この属性は、既存のユーザーのエイリアスではなくなります。

すべての認証済みユーザーはサインインできます。サインインに成功すると、アクセストークンおよび ID トークンが返されます。これらのトークンは、CognitoUserSession オブジェクト内に含まれます。

ステップ 6: ユーザーをアプリにサインインする

ユーザーをアプリにサインインするには、まず認証用のコールバックハンドラーを作成する必要があります。次の例は、SDK がこのコールバックハンドラーを介してアプリケーションとやり取りする方法を示しています。

// Callback handler for the sign-in process AuthenticationHandler authenticationHandler = new AuthenticationHandler() { @Override public void onSuccess(CognitoUserSession cognitoUserSession) { // Sign-in was successful, cognitoUserSession will contain tokens for the user } @Override public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) { // The API needs user sign-in credentials to continue AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, password, null); // Pass the user sign-in credentials to the continuation authenticationContinuation.setAuthenticationDetails(authenticationDetails); // Allow the sign-in to continue authenticationContinuation.continueTask(); } @Override public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) { // Multi-factor authentication is required; get the verification code from user multiFactorAuthenticationContinuation.setMfaCode(mfaVerificationCode); // Allow the sign-in process to continue multiFactorAuthenticationContinuation.continueTask(); } @Override public void onFailure(Exception exception) { // Sign-in failed, check exception for the cause } }; // Sign in the user cognitoUser.getSessionInBackground(authenticationHandler);

ステップ 7: ユーザーの詳細を取得する

ユーザーを認証したら、次の例に示すように、ユーザープール内のユーザーに関する他の情報を取得できます。

// Implement callback handler for getting details GetDetailsHandler getDetailsHandler = new GetDetailsHandler() { @Override public void onSuccess(CognitoUserDetails cognitoUserDetails) { // The user detail are in cognitoUserDetails } @Override public void onFailure(Exception exception) { // Fetch user details failed, check exception for the cause } }; // Fetch the user details cognitoUser.getDetailsInBackground(getDetailsHandler);

ステップ 8: アプリユーザーが AWS リソースにアクセスするための認証情報を取得する

ユーザーが AWS リソースにアクセスするための認証情報を取得するには、まず ID プールを作成し、ユーザープールをその認証プールに関連付けます。

AWS 認証情報を取得して AWS リソースにアクセスするには

  1. Amazon Cognito コンソールにサインインします。

  2. フェデレーテッドアイデンティティの管理を選択します。

  3. [Create new identity pool] を選択します。[Identity pool name] に ID プールの名前を入力します。

  4. [Authentication providers] セクションを展開します。[Cognito] タブで、前の手順で作成したユーザープールの [User Pool ID] と [App Client ID] を入力します。

  5. [Create Pool] を選択します。

  6. アプリケーションコードで、以下のように、認証に成功した後に受け取った ID トークンを認証情報プロバイダーに追加します。

    // Get id token from CognitoUserSession. String idToken = cognitoUserSession.getIdToken().getJWTToken(); // Create a credentials provider, or use the existing provider. CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(context, IDENTITY_POOL_ID, REGION); // Set up as a credentials provider. Map<String, String> logins = new HashMap<String, String>(); logins.put("cognito-idp.us-east-1.amazonaws.com/us-east-1_123456678", cognitoUserSession.getIdToken().getJWTToken()); credentialsProvider.setLogins(logins);
  7. 以下のように、認証情報プロバイダーを使用して Amazon DynamoDB テーブルなどの AWS リソースにアクセスします。

    AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient(credentialsProvider);

ステップ 9: AWS リソースにアクセスできるように IAM の権限を設定する

ID プールを作成すると、Amazon Cognito により 2 つの IAM ロール Cognito<identity pool name>Auth_Role および Cognito<identity pool name>Unauth_Role が作成されます。デフォルトでは、これらのロールにより Amazon Cognito ID と Amazon Cognito Sync へのアクセスのみ許可されます。アプリケーションが Amazon DynamoDB などの AWS サービスにアクセスできるようにするには、適切な管理ポリシーをロールにアタッチする必要があります。たとえば、アプリケーションが DynamoDB データベースの読み取りと書き込みを行う必要がある場合、以下の手順で説明するように AmazonDynamoDBFullAccess 管理ポリシーをロールにアタッチする必要があります。

AWS リソースにアクセスできるように IAM の権限を設定するには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. ロールのリストからポリシーの認証済みロールを選択し、[Attach Policy] を選択します。

  3. 管理ポリシーのリストに必要なポリシーを選択し (AmazonDynamoDBFullAccess など)、[Attach Policy] を選択します。

アプリケーションが DynamoDBで作成、読み取り、更新、および削除操作を実行できるようになります。

ステップ 10: ユーザーの新しい Multi-Factor Authentication メカニズムをセットアップする

Amazon Cognito SDK バージョン 2.6.8 以降では、ユーザーの新しい MFA メカニズムをセットアップできます。ユーザープールレベルの MFA の設定は、Amazon Cognito ユーザープールコンソールの [MFA and verifications] タブで管理できます。

新しい MFA メソッドを登録するには、まずユーザープールでメソッドを有効にする必要があります。

ソフトウェアトークン (TOTP) MFA の設定

Amazon Cognito では、時間ベースのワンタイムパスワードアルゴリズム (TOTP) Multi-Factor Authentication (MFA) メカニズムをサポートしています。

TOTP 設定プロセスは 2 つのステップで構成されます。

  1. ソフトウェアトークンの関連付け : これは、Amazon Cognito サービスでユーザーの TOTP MFA を追加することをリクエストすることで、プロセスを開始します。これにより、ユーザーに設定済みの TOTP MFA が上書きされます。このリクエストに応じ、サービスでシークレットキーが生成されます。このキーは安全に保存し、MFA 検証用の TOTP コードの生成に使用する必要があります。

  2. ソフトウェアトークンの検証: シークレットキーから生成した TOTP コードを使用して MFA セットアップを完了します。このステップを完了するには、Amazon Cognito SDK から返された VerifyMfaContinuation オブジェクトを使用します。

// Create a callback handler. RegisterMfaHandler registerMFAHandler = new RegisterMfaHandler() { @Override public void onSuccess(final String sessionToken) { // Success, new MFA setup is complete. } @Override public void onVerify(VerifyMfaContinuation continuation) { // Get the secret key from Continuation. String secretKey = continuation.getParameters().get("secretKey"); // Store the secret key in a TOTP code generator and verify using // the generated TOTP code. String verificationCode = storeAndGetTotpVerificationCode(secretKey); // Set a user friendly name to remember the TOTP generator. String friendlyName = "the best TOTP generator"; // Complete the registration by verifying the TOTP code. continuation.setVerificationResponse(verificationCode, friendlyName); continuation.continueTask(); } @Override public void onFailure(Exception exception) { closeWaitDialog(); showDialogMessage("TOTP MFA registration failed", AppHelper.formatException(exception), false); } }; // Use the CognitoUser to register a new Software Token MFA. associateSoftwareTokenInBackground(sessionToken, registerMFAHandler);

注記

TOTP ソフトウェアトークン MFA とアプリケーションの関連付けは、1 ユーザーあたり 1 つのみ許可されます。新しい MFA ソフトウェアトークンを関連付けると、現在の関連付けが上書きされます。

TOTP MFA ソフトウェアトークンを関連付けるには、有効なアクセストークンを使用してユーザーを認証する必要があります。新しい TOTP MFA ソフトウェアトークンを関連付けるために未認証のユーザーが必要な場合は、Amazon Cognito で生成された sessionToken を使用して新しい TOTP MFA ソフトウェアを関連付けることができます。

セッショントークンでの MFA の設定

Amazon Cognito ユーザープール で複数の MFA タイプがサポートされるようになりました。Amazon Cognito コンソールのユーザープールで許可されている MFA タイプを有効にすることができます。有効化した MFA タイプを [Optional] または [Required] に設定することも選択できます。

MFA を [Optional] に設定した場合、プールのユーザーは、設定内容に応じて、1 つ以上の MFA のメソッドを登録して有効化することを選択できます。

ユーザープールに対して MFA を [Required] に設定した場合、ユーザーは少なくとも 1 つの MFA タイプを登録して有効化する必要があります。MFA が必須の場合、少なくとも 1 つの MFA メソッドがセットアップされていないユーザーは、MFA_SETUP チャレンジを提供されます。ユーザーは、認証を続けるために少なくとも 1 つの MFA タイプをセットアップする必要があります。

この段階で新しい MFA メソッドの登録をユーザーに許可する場合、Amazon Cognito はチャレンジと共にセッショントークンを返します。このセッショントークンを SDK で使用して MFA タイプを登録してから、認証を継続できます。セッショントークンは、1 回限りのトークンとして、新しい MFA タイプの登録に使用できます。

MFA_SETUP チャレンジ

MFA_SETUP チャレンジがスローされると、ユーザーは MFA メソッドをセットアップする必要があります。Amazon Cognito SDK から RegisterMFAContinuation が返されます。この継続を使用して、ユーザーがセットアップして認証を継続するための MFA タイプのリストを取得します。

AuthenticationHandler authHandler = new AuthenticationHandler() { @Override public void onSuccess(CognitoUserSession cognitoUserSession) { // ... } @Override public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) { // ... } @Override public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) { // ... } @Override public void authenticationChallenge(ChallengeContinuation continuation) { // This challenge is invoked for MFA_SETUP Challenge RegisterMFAContinuation regMFAContinuation = (RegisterMFAContinuation) continuation; // Register the new MFA. registerMfa(regMFAContinuation); } @Override public void onFailure(Exception exception) { // Sign-in failed, check exception for the cause } }; // Register a new MFA. public void registerMfa(RegisterMFAContinuation regMFAContinuation) { // Get the list of MFA's to setup. List<String> mfaOptions = continuation.getMfaOptions(); // Get the session token to register an MFA. final String sessionToken = continuation.getSessionToken(); // ... // Use the sessionToken to register MFA. associateSoftwareTokenInBackground(sessionToken, registerMFAHandler); } RegisterMfaHandler registerMFAHandler = new RegisterMfaHandler() { @Override public void onSuccess(final String sessionToken) { // Success, new MFA setup is complete. // Use the sessionToken to continue to authenticate. regMFAContinuation.setSessionToken(sessionToken); } @Override public void onVerify(VerifyMfaContinuation continuation) { // ... } @Override public void onFailure(Exception exception) { // ... } };

MFA メカニズムの有効化/無効化

MFA を有効化または無効化する場合や、ユーザーの優先 MFA タイプを設定する場合は、API setUserMfaSettings を使用します。

GenericHandler updatesMFASettingsHandler = new GenericHandler() { @Override public void onSuccess() { // Update complete. } @Override public void onFailure(Exception exception) { // Failed update, check exception for details. } }; // Enable SMS MFA and set preferred state void enableSmsMfa(boolean preferred) { CognitoMfaSettings smsMfaSettings = new CognitoMfaSettings(CognitoMfaSettings.SMS_MFA); smsMfaSettings.setEnabled(true); smsMfaSettings.setPreferred(preferred); List<CognitoMfaSettings> settings = new ArrayList<CognitoMfaSettings>(); settings.add(smsMfaSettings); cognitoUser.setUserMfaSettingsInBackground(settings, updateSettingHandler); }

MFA チャレンジの選択

ユーザーが複数の MFA タイプを有効にしていて、そのいずれも「優先」として設定していない場合、Amazon Cognito はユーザーが MFA メソッドを選択して認証できるように SELECT_MFA_TYPE チャレンジを提供します。

AuthenticationHandler authHandler = new AuthenticationHandler() { @Override public void onSuccess(CognitoUserSession cognitoUserSession) { // ... } @Override public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) { // ... } @Override public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) { // ... } @Override public void authenticationChallenge(ChallengeContinuation continuation) { ChooseMfaContinuation mfaOptionsContinuation = (ChooseMfaContinuation) continuation; // Get the list of MFA's to choose from List<String> mfaOptions = mfaOptionsContinuation.getMfaOptions(); // ... // Set the MFA option and continue to authenticate. mfaOptionsContinuation.setMfaOption(option); mfaOptionsContinuation.continueTask(); } @Override public void onFailure(Exception exception) { // Sign-in failed, check exception for the cause } };