この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、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.json
のscripts
に今回作成するスクリプトの実行コマンドを記載します。
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のまま使っちゃっていたので、今回リメイクできて良かったです。今後はこちらを使っていこうと思います。
以上