概要
Amazon Cognito の User Pool の JSON ウェブトークン (JWT) を取得・検証してみた。
※ User Pool のみ使用。ID Pool は不要。無料で検証可。
JWTの取得
get-id-token.ts
Amazon Cognito の IDトークンは、JWTである (Understanding the identity (ID) token)。
まずは、そのIDトークンを取得する。
参考
Cognito User Pool
Cognitoにおいて、GUIでのユーザー作成は、「パスワードを強制的に変更」ステータスから「確認済み」への変更が面倒くさいため、AWS CLIからユーザーを作成する。
# ユーザーを作成
aws cognito-idp admin-create-user --user-pool-id "[COGNITO_USER_POOL_ID]" --username "[COGNITO_USER_NAME]" --user-attributes Name=email,Value="[COGNITO_USER_NAME]" Name=email_verified,Value=true --message-action SUPPRESS
# ユーザーのパスワードを変更
aws cognito-idp admin-set-user-password --user-pool-id "[COGNITO_USER_POOL_ID]" --username "[COGNITO_USER_NAME]" --password "[COGNITO_USER_PASSWORD]" --permanent
参考
その他参考
JWTの検証
jsonwebtokenを使用
-
- Amazon Cognito の JWT は、公開鍵方式 (秘密鍵で署名の作成、公開鍵で署名の検証) で署名されている。上記サイトIDプロバイダが、今回の場合は Amazon Cognito となる。
-
CognitoのJWTをNode.js(Typescript)で検証する方法
-
jsonwebtokenでJWTの検証を行っている。
-
jwt-verify
を使用。
-
-
node-jwks-rsaで、 JWT の kid を基に公開鍵を取得。
- 公開鍵は、 Amazon Cognitoの
https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json
(参考:Verifying a JSON Web Token) から取得できる。
- 公開鍵は、 Amazon Cognitoの
-
jsonwebtokenでJWTの検証を行っている。
-
Verifying a JSON Web Tokenでは、以下の検証を要求している。
- トークンは、有効期限切れではない
-
jwt-verify
は、デフォルトで有効期限切れか否かの確認をしてくれる(参考:node-jsonwebtokeの検証処理についての流れを確認する)。- option に
ignoreExpiration
の設定がわざわざある。
- option に
-
- IDトークンに含まれる aud クレームは、 App Client Id と一致している
- option の
audience
に、Cognito の App Client Id を設定することで、 aud の検証を追加できる。
- option の
- IDトークンに含まれる issur クレーム (iss) は、 User Pool (
https://cognito-idp.<region>.amazonaws.com/<userpoolID>
) と一致している- option の
issure
に、Cognito の User Pool を設定することで、 issure の検証を追加できる。
- option の
- token_use クレームの確認 (IDトークンのみを使用する場合、IDトークンの token_use クレームが id になっている)
- IDトークンのデコード結果は、 payload であり、その中に token_use があるので、チェックする。
- トークンは、有効期限切れではない
AWS JWT Verifyを使用
-
AWS JWT Verify
- Amazon Cognito JSON ウェブトークンの署名を復号して検証するにはどうすればよいですか?
- Verifying a JSON Web Tokenで検証を要求している項目が、全てデフォルトで入っている。
その他参考
-
[Node.js / TypeScript] Amazon CognitoのJWTをデコードする、JWTを作成してテストする
- jwt-decodeでJWTのデコードを行っている。JWTの検証はしていない。