メニュー
Amazon Cognito
開発者ガイド (Version 最終更新日: 2017 年 8 月 26 日)

チュートリアル: 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 で作成されます。

Copy
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. プールインスタンスを使用して、ユーザーをサインアップします。

    Copy
    // 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 メソッドは、サインアップに成功すると呼び出されます。

    Copy
    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 を呼び出します。

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

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

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

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

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

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

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

    Copy
    // 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 に設定します。これにより、ユーザーの確認が失敗して競合が解決されます。既存のユーザーの属性は確認済みのままで、引き続き既存のユーザーのエイリアスとなります。新しいユーザーは、次の例に示すように未確認のままです。

    Copy
    // 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 がこのコールバックハンドラーを介してアプリケーションとやり取りする方法を示しています。

Copy
// 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: ユーザーの詳細を取得する

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

Copy
// 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 トークンを認証情報プロバイダーに追加します。

    Copy
    // 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 リソースにアクセスします。

    Copy
    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で作成、読み取り、更新、および削除操作を実行できるようになります。