npm scriptsから実行してCognitoユーザーのIDトークンを取得できるスクリプト(TypeScript)を作ってみた

2022.01.27

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

以前のエントリで、Amazon Cognitoユーザープール上のユーザーのトークン情報をadmin-initiate-authで取得する方法を確認しました。

今回は、このトークン取得をnpmプロジェクト内でもっと簡単に行えるように、npm scriptsから実行してCognitoユーザーのIDトークンを取得できるスクリプト(TypeScript)を作ってみました。

作ってみた

前提

Cognitoユーザープールの環境はすでに作成済みで、以前のエントリの内容であれば実施可能である前提とします。

準備

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

$ npm i aws-sdk
$ npm i -D typescript ts-node dotenv dotenv-cli

.envファイルにCognitoユーザープールIDとクライアントIDを記述します。

.env

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

package.jsonに次のようにscriptsを記述します。dotenv.envの環境変数を使用可能としています。またts-nodeでtsスクリプトを実行できるようにしています。

package.json

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

スクリプト

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

cognito-user-id-token-helper.ts

import * as CognitoIdp from 'aws-sdk/clients/cognitoidentityserviceprovider';

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_MY_PASSWORD!;

export const cognitoIdpClient = new CognitoIdp({
  apiVersion: COGNITO_API_VERSION,
  region: REGION,
});

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

  const response = await cognitoIdpClient.adminInitiateAuth(params).promise();

  const idToken = response.AuthenticationResult?.IdToken!;

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

getIdToken();

動作

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

$ export MY_USERNAME=XXXXXXXXX
$ export MY_PASSWORD=YYYYYYYYYYYY

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

$ npm run get-user-id-token

ID_TOKEN="eyJraWQiOiJpWUVSNVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..."

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

おわりに

npm scriptsから実行してCognitoユーザーのIDトークンを取得できるスクリプト(TypeScript)を作ってみました。

Cognitoオーソライザーを設定したAPI Gateway Rest APIのE2Eテストを実施するたびにIDトークンを取得し直すのが手間だったので、これで簡略化できそうです!

以上