【Java版】AWSのSDKを使ってCognito認証を実現する
AWS で運用している API サービスに対して、特定のクライアントからのアクセスを許可したい。
こんな時、AWS Cognito を利用すれば、利用者ごとに一意な ID を割り振ることができます。
今回は既に Cognito で以下が設定されている前提で、Java 版の AWS SDK を使って認証を通してみましょう。
・ユーザプール
・ユーザ
・アプリクライアント
・クレデンシャル(IAM)
今回のケースでは、ユーザプールから取得した ID トークンをリクエストヘッダの Authorization に Bearer で指定させ、AWS の Web サービスとの認証が可能にすることを目的としています。
利用するライブラリ
AWS SDK の中から Cognito に特化したライブラリを利用してみましょう。
software.amazon.awssdk:cognitoidentityprovider
以下が SDK の Maven リポジトリ。
以下が SDK の GitHub になります。
本記事では v2 系を利用します(例では 2.31.0。実際は最新の安定版に合わせてください)。
本記事は AWS SDK for Java v2(software.amazon.awssdk)で解説しています。
旧 v1.x(com.amazonaws)は 2025 年 12 月 31 日でサポート終了(end-of-support)となったため、既存の v1 コードは v2 への移行が推奨されます。
認証フローは v2 の推奨に合わせて ADMIN_USER_PASSWORD_AUTH を使用しています(旧 ADMIN_NO_SRP_AUTH の後継)。
出典:Announcing end-of-support for AWS SDK for Java v1.x(AWS Developer Tools Blog)
Kotlin DSL の gradle の場合は以下のように定義すれば問題ありません。
implementation("software.amazon.awssdk:cognitoidentityprovider:2.31.0")CognitoIdentityProviderClient の取得
まずは AWS のクレデンシャルを使って、CognitoIdentityProviderClient オブジェクトの作成をしてみましょう。
クレデンシャルはプロファイル(aws configure で生成した profile)でもいいですし、以下のキー値を直接指定することもできます。
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
プロファイルを使う
プロファイルを使う場合は、ProfileCredentialsProvider.create() の引数にプロファイル名を指定します。
AwsCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create("profileName");
CognitoIdentityProviderClient cognitoClient = CognitoIdentityProviderClient.builder()
.credentialsProvider(credentialsProvider)
.region(Region.AP_NORTHEAST_1)
.build();キー値を使う
「AWS_ACCESS_KEY_ID」と「AWS_SECRET_ACCESS_KEY」を使う場合は AwsBasicCredentials を利用します。
これで AwsCredentials が生成されるので、StaticCredentialsProvider を利用して AwsCredentialsProvider を作ります。
AwsBasicCredentials credentials = AwsBasicCredentials.create("AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY");
AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(credentials);
CognitoIdentityProviderClient cognitoClient = CognitoIdentityProviderClient.builder()
.credentialsProvider(credentialsProvider)
.region(Region.AP_NORTHEAST_1)
.build();セッショントークンを利用する場合は AwsBasicCredentials ではなく AwsSessionCredentials になります。
AwsSessionCredentials credentials = AwsSessionCredentials.create("AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN");
AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(credentials);
CognitoIdentityProviderClient cognitoClient = CognitoIdentityProviderClient.builder()
.credentialsProvider(credentialsProvider)
.region(Region.AP_NORTHEAST_1)
.build();AssumeRoleを使う
いやいや、IAM ロールを使って Assume Role を利用したいという場面もありますよね。
AssumeRoleRequest assumeRoleRequest = AssumeRoleRequest.builder()
.roleArn("IAMロールのARN")
.roleSessionName("任意の文字列")
.build();
StsClient sts = StsClient.builder()
.credentialsProvider(InstanceProfileCredentialsProvider.create())
.region(Region.AP_NORTHEAST_1)
.build();
Credentials credentials = sts.assumeRole(assumeRoleRequest).credentials();credentials に以下の情報が入っているので、
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
・AWS_SESSION_TOKEN
あとは上で書いた AwsSessionCredentials を利用すれば OK です。
AwsSessionCredentials sessionCredentials = AwsSessionCredentials.create(
credentials.accessKeyId(),
credentials.secretAccessKey(),
credentials.sessionToken()
);
AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(sessionCredentials);
CognitoIdentityProviderClient cognitoClient = CognitoIdentityProviderClient.builder()
.credentialsProvider(credentialsProvider)
.region(Region.AP_NORTHEAST_1)
.build();IDトークンを取得する
冒頭でも書きましたが、既に Cognito のユーザプールやユーザは作成されているとします。
ID トークンの取得に必要は情報は以下の通り。
・ユーザ名
・パスワード
・ユーザプールID
・クライアントID
先ほど取得した CognitoIdentityProviderClient(cognitoClient)と上記の情報を合わせて認証してみましょう。
Map<String, String> authParameters = new HashMap<>();
authParameters.put("USERNAME", "ユーザ名");
authParameters.put("PASSWORD", "パスワード");
AdminInitiateAuthRequest request = AdminInitiateAuthRequest.builder()
.authFlow(AuthFlowType.ADMIN_USER_PASSWORD_AUTH)
.userPoolId("ユーザプールID")
.clientId("クライアントID")
.authParameters(authParameters)
.build();
AdminInitiateAuthResponse authResponse = cognitoClient.adminInitiateAuth(request);ID トークンは以下のように取得できます。
authResponse.authenticationResult().idToken()まとめ
AWS の Java SDK を使って、Cognito の認証を行ってみました。
必要な情報が揃っていれば、それほど大変な作業ではありませんね。
ちなみに ID トークンは JWT(JSON Web Token)形式となっています。
さらにヘッダ部分やペイロード部分を検証してあげることで、トークンが意図したものかどうか確認ができます。

