この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、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
}
}
スクリプト
adminInitiateAuth
APIを使用してトークン情報を取得し、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トークンを取得し直すのが手間だったので、これで簡略化できそうです!
以上