目次
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プールの使い方
本記事で紹介する内容は、以下の通りです。
- 「GetId」でIdentityIdを取得
- 「GetCredentialsForIdentity」でAWS 認証情報(クレデンシャル)を取得
- 取得したAWS認証情報でユーザープールに接続
- 取得したAWS認証情報でIAMに接続
- 取得した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 関連記事]
- Amazon Cognito ユーザープールの使い方
- Amazon S3からファイルをダウンロードする方法
- 【Amazon Cognito】JavaScriptでログイン処理を実装する方法
- 【Amazon Cognito】getSessionでトークン情報を再取得する方法
- 【Amazon Cognito】changePasswordでパスワードを変更する方法