Java

【Amazon Cognito】IDプールの使い方(Java SDK)

2020年8月14日

IDプールとは

Amazon Cognitoには、ユーザープールとIDプールが存在します。

ユーザープールでは、認証(ログイン)やユーザー情報、グループの管理などを行うことができます。

IDプールでは、ユーザーのアクセスコントール(S3など利用するAWSサービスを選べる)をすることができ、AWS 認証情報(アクセスキーやシークレットキー)を一時的に生成します。そして、生成されたAWS認証情報を使い、S3などの他のAWSサービスにアクセスすることができます。

スポンサーリンク

本記事では、Java用のSDK(AWS SDK for Java 1.11)でAmazon CognitoのIDプールの使い方を紹介します。

事前準備

AWSのJDKを使う設定をします。pomの場合は、次の内容を追加してAWSのSDKを使用できるようにします。

  • ユーザープール:aws-java-sdk-cognitoidp
  • IDプール:aws-java-sdk-cognitoidentity
  • S3:aws-java-sdk-s3
  • IAM:aws-java-sdk-iam
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-cognitoidp</artifactId>
  <version>1.11.828</version>
</dependency>

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-cognitoidentity</artifactId>
  <version>1.11.828</version>
</dependency>

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-s3</artifactId>
  <version>1.11.828</version>
</dependency>

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-iam</artifactId>
  <version>1.11.828</version>
</dependency

IDプールの使い方

本記事で紹介する内容は、以下の通りです。

  1. 「GetId」でIdentityIdを取得
  2. 「GetCredentialsForIdentity」でAWS 認証情報(クレデンシャル)を取得
  3. 取得したAWS認証情報でユーザープールに接続
  4. 取得したAWS認証情報でIAMに接続
  5. 取得したAWS認証情報でS3に接続

IDプールのAPIリファレンスは、以下の公式サイトをご覧ください。

API Reference:https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/Welcome.html

(1) 「GetId」でIdentityIdを取得する

まずは、IDプールに接続するために必要な「AmazonCognitoIdentity」を生成します。

AWSCredentials credentials = new BasicAWSCredentials("アクセスキー","シークレットキー");

AmazonCognitoIdentity idPoolClient =  AmazonCognitoIdentityClientBuilder.standard()
        .withCredentials(new AWSStaticCredentialsProvider(credentials))
        .withRegion(Regions.AP_NORTHEAST_1)
        .build();

次に「GetId」で IdentityId を取得します。IdentityIdは、「GetCredentialsForIdentity」で必要な情報です。

// ログイン情報の生成
// <region>:リージョン
// <YOUR_USER_POOL_ID>:ユーザープールID
// <IdToken>:認証成功時に取得したIdToken
Map<String, String> logins = new HashMap<String, String>();
logins.put("cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>", "<IdToken>");

// IdentityIdの取得
GetIdRequest idRequest = new GetIdRequest();
idRequest.setIdentityPoolId("IDプールのID");
idRequest.setLogins(logins);
GetIdResult idResult = idPoolClient.getId(idRequest);

<region>には、リージョン(東京の場合は、ap-northeast-1)、<YOUR_USER_POOL_ID>にはユーザープールID、<IdToken>には、ユーザープールで認証に成功した際に取得した IdToken が入ります。

スポンサーリンク

(2) 「GetCredentialsForIdentity」でAWS 認証情報(クレデンシャル)を取得する

「GetId」で取得した IdentityId を指定してAWS 認証情報(クレデンシャル)を取得します。

※setLoginsには「GetId」と同じ値が入る

// ログインユーザーのクレデンシャル情報の取得
GetCredentialsForIdentityRequest credentialsForIdentityRequest = new GetCredentialsForIdentityRequest();
credentialsForIdentityRequest.setIdentityId(idResult.getIdentityId());
credentialsForIdentityRequest.setLogins(logins);
GetCredentialsForIdentityResult credentialsForIdentityResult =
        idPoolClient.getCredentialsForIdentity(credentialsForIdentityRequest);

(3) 取得したAWS認証情報でユーザープールに接続する

「GetCredentialsForIdentity」で取得した「アクセストークン」「シークレットキー」「セッショントークン」を使いユーザープールのAWSCognitoIdentityProviderを生成します。

// ログインユーザーのクレデンシャル情報でAWSStaticCredentialsProviderを生成
BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(
        credentialsForIdentityResult.getCredentials().getAccessKeyId(),
        credentialsForIdentityResult.getCredentials().getSecretKey(),
        credentialsForIdentityResult.getCredentials().getSessionToken());
AWSStaticCredentialsProvider provider = new AWSStaticCredentialsProvider(sessionCredentials);


// ユーザプールクライアントの生成
AWSCognitoIdentityProvider userPoolClient = AWSCognitoIdentityProviderClientBuilder.standard()
        .withCredentials(provider)
        .withRegion(Regions.AP_NORTHEAST_1)
        .build();

[ユーザープールのAPI使用例]

AdminListGroupsForUserでユーザーが所属しているグループ情報を取得することができます。

AdminListGroupsForUserRequest adGroupsUserRequest = new AdminListGroupsForUserRequest();
adGroupsUserRequest.setUsername("ユーザー名");
adGroupsUserRequest.setUserPoolId("ユーザープールID");
AdminListGroupsForUserResult userPoolClient.adminListGroupsForUser(adGroupsUserRequest);

ユーザープールのAPIリファレンスは、以下の公式サイトをご覧ください。

API Reference:https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference

(4) 取得したAWS認証情報でIAMに接続する

「GetCredentialsForIdentity」で取得した「アクセストークン」「シークレットキー」「セッショントークン」を使いIAMのAmazonIdentityManagementを生成します。

// ログインユーザーのクレデンシャル情報でAWSStaticCredentialsProviderを生成
BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(
        credentialsForIdentityResult.getCredentials().getAccessKeyId(),
        credentialsForIdentityResult.getCredentials().getSecretKey(),
        credentialsForIdentityResult.getCredentials().getSessionToken());
AWSStaticCredentialsProvider provider = new AWSStaticCredentialsProvider(sessionCredentials);

// IAMクライアントの生成
AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard()
        .withCredentials(provider)
        .withRegion(Regions.AP_NORTHEAST_1)
        .build();

[IAMのAPI使用例]

ListRoleTagsでIAMロールのタグ情報を取得することができます。

ListRoleTagsRequest listRoleTagsRequest = new ListRoleTagsRequest().withRoleName("ロール名");
ListRoleTagsResult roleTags = iamClient.listRoleTags(listRoleTagsRequest);

IAMのAPIリファレンスは、以下の公式サイトをご覧ください。

API Reference:https://docs.aws.amazon.com/ja_jp/IAM/latest/APIReference/welcome.html

(5) 取得したAWS認証情報でS3に接続する

「GetCredentialsForIdentity」で取得した「アクセストークン」「シークレットキー」「セッショントークン」を使いS3のAmazonS3を生成します。

// ログインユーザーのクレデンシャル情報でAWSStaticCredentialsProviderを生成
BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(
        credentialsForIdentityResult.getCredentials().getAccessKeyId(),
        credentialsForIdentityResult.getCredentials().getSecretKey(),
        credentialsForIdentityResult.getCredentials().getSessionToken());
AWSStaticCredentialsProvider provider = new AWSStaticCredentialsProvider(sessionCredentials);

// S3クライアントの生成
AmazonS3 s3Client = AmazonS3ClientBuilder
        .standard()
        .withCredentials(provider)
        .withRegion(Regions.AP_NORTHEAST_1)
        .build();

S3のAPIリファレンスは、以下の公式サイトをご覧ください。

API Reference:https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/API_Operations_Amazon_Simple_Storage_Service.html

終わりに

本記事では、Amazon CognitoのIDプールの使い方について紹介しました。

次回は「Amazon S3へファイルをアップロードする方法」について紹介します。

[AWS 関連記事]

helpful