CognitoユーザーのIDトークンを取得するスクリプトを書いてみた(AWS SDK for JavaScript v3)

2022.05.20

こんにちは、CX事業本部 IoT事業部の若槻です。

以前、Amazon Cognito上のユーザーのIDトークンを取得するヘルパースクリプトを紹介しました。

しかしこの時に使用したAWS SDK for JavaScriptはv2だったため、最新のv3よりも1世代前となっています。

そこで今回は、AWS SDK for JavaScript v3を使用して、CognitoユーザーのIDトークンを取得するスクリプトをリメイクしてみました。

やってみた

前提

次の環境を使用します。

  • typescript@3.9.10
  • ts-node@9.1.1

またこちらは作成済みとします。

  • Cognito User Pool
  • Cognito User Pool Cliant App
  • Cognito User Pool上のユーザー

準備

AWS SDK for JavaScript v3はサービス毎にパッケージが分かれています。ユーザーのIDトークンを取得できるAdminInitiateAuth APIを使用したい場合は次のCognito Identity Provider Clientを使用します。

パッケージをインストールします。

$ npm install @aws-sdk/client-cognito-identity-provider

# .envから環境変数を設定できる
$ npm i -D dotenv dotenv-cli

.envファイルにCognito User Poolの情報を記載します。

.env

USER_POOL_ID="ap-northeast-1_XXXXXXXXX"
COGNITO_CLIENT_ID="xxxxxxxxxxxxxxxxxxxxxxx"

package.jsonscriptsに今回作成するスクリプトの実行コマンドを記載します。

package.json

{
  "scripts": {
    "get-my-user-id-token": "dotenv -e .env -- ./node_modules/.bin/ts-node ./get-cognito-my-user-id-token-helper.ts"
  }
}

スクリプト

AdminInitiateAuth APIを使用してトークン情報を取得し、IDトークンを標準出力するようにしています。

get-cognito-my-user-id-token-helper.ts

import {
  CognitoIdentityProviderClient,
  AdminInitiateAuthCommand,
  AdminInitiateAuthCommandInput,
} from '@aws-sdk/client-cognito-identity-provider';

const COGNITO_API_VERSION = '2016-04-18';
const REGION = 'ap-northeast-1';
const COGNITO_USER_POOL_ID = process.env.USER_POOL_ID!;
const COGNITO_CLIENT_ID = process.env.COGNITO_CLIENT_ID!;
const MY_USERNAME = process.env.MY_USERNAME!;
const MY_PASSWORD = process.env.MY_PASSWORD!;

const client = new CognitoIdentityProviderClient({
  apiVersion: COGNITO_API_VERSION,
  region: REGION,
});

/**
 * IDトークンを取得
 */
const getIdToken = async (): Promise<void> => {
  const params: AdminInitiateAuthCommandInput = {
    UserPoolId: COGNITO_USER_POOL_ID,
    ClientId: COGNITO_CLIENT_ID,
    AuthFlow: 'ADMIN_USER_PASSWORD_AUTH',
    AuthParameters: {
      USERNAME: MY_USERNAME,
      PASSWORD: MY_PASSWORD,
    },
  };

  const response = await client.send(new AdminInitiateAuthCommand(params));
  const idToken = response.AuthenticationResult?.IdToken!;

  console.log(`ID_TOKEN="${idToken}"`);
};

getIdToken();

v3はやはり作成したCommandをSendする書き方となるのが特徴的ですね。

動作

Cognitoユーザーのユーザー名とパスワードを環境変数で指定します。

$ export MY_USERNAME=XXXXXXXXX
$ export MY_PASSWORD=YYYYYYYYYYYY

スクリプトを実行します。するとコンソールにID_TOKEN="<IDトークン>"と出力され、IDトークンを取得できました!

$ npm run get-my-user-id-token

> aws-cdk-v2-project@0.1.0 get-my-user-id-token
> dotenv -e .env -- ./node_modules/.bin/ts-node ./get-cognito-my-user-id-token-helper.ts

ID_TOKEN="eyJraWQiOiJQZWlVNlpAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

あとはこれをexportしたり、.envファイルに記載するなりすれば、他の処理(Cognito認証を伴うE2Eテストなど)でも利用できるようになります!

注意点

スクリプトをローカルで実行しようとしたため、今回もこちらに引っかかりました…。認証をAssumeRoleで行う際は忘れずにunset AWS_PROFILEをしましょう。

おわりに

AWS SDK for JavaScript v3を使用して、CognitoユーザーのIDトークンを取得するスクリプトをリメイクしてみました。

以前のスクリプトはCognitoユーザーの認証を伴うE2Eテストの実行などでたまに使っていたのですが、v3にアップデートできずv2のまま使っちゃっていたので、今回リメイクできて良かったです。今後はこちらを使っていこうと思います。

以上