Cognito の認証で取得した ID トークン。
以前、Java のライブラリで JWT の整合性の検証を行いました。

今回は TypeScript において、JWT の検証に最適なライブラリを検索する機会があったので TIPS 化。
用途によって使い分けは必要になりますが、2 つ紹介していきます。
decode-verify-jwt
aws-support-tools の GitHub にある、AWS のプレミアムサポートが提供するツールとサンプルコード。
その中に、Cognito の ID トークンのデコードと検証を行うソースコードも紹介されています。
Decode and verify Amazon Cognito JWT tokens
TypeScript と Python の 2 つのサンプル。
今回は TypeScript 版を見てみましょう。
.well-known/jwks.json のチェックはもちろん、有効期限のチェックもされていますね。
Error で throw されると他のエラーとの区別がメッセージでしかできないので、独自の Error クラスを作るのが理想なのでしょうか。
1 2 3 | if (currentSeconds > claim.exp || currentSeconds < claim.auth_time) { throw new Error('claim is expired or invalid'); } |
nodejs-jwt-validator
上記の decode-verify-jwt をカスタマイズしたものなのでしょうか。
AWS に掲載されている JWT の検証方法については考慮されてそうです。
decode-verify-jwt と同じく、ライブラリの中でトークンの有効期限のチェックをしています。
1 2 3 | if (this.validationOptions.validateExp && (currentSeconds > claim.exp || currentSeconds < claim.auth_time)) { throw new Error("claim is expired or invalid"); } |
有効期限のチェックは別のところで行いたいと思うケースもありますよね。
こちらも Error オブジェクトが throw されてくるだけなので、有効期限切れだけをハンドリングするのは少し手間です。
auth0/jwt-decode
そんな時は純粋に JWT のデコードのみライブラリに頼り、トークンの整合性の検証は自前で用意するのもアリ。
参考までにデコードのサンプルを書いてみます。
1 2 3 4 5 6 7 8 | import jwt_decode from "jwt-decode"; type MapClaims = { [name: string]: string; }; const idToken = "[IDトークン]"; const claims = jwt_decode<MapClaims>(idToken); |
jwt_decode がコンストラクタっぽい感じで使えるのは、default function が指定されているからなのですね。
1 2 3 4 | export default function jwtDecode<T = unknown>( token: string, options?: JwtDecodeOptions ): T; |
まとめ
TypeScript や NodeJS で利用できる JWT のトークン検証ライブラリを紹介してきました。
Cognito の利用に限定した話ではないでアレですが、トークンの検証機能は AWS の SDK に含まれていてもいいのになっと。
せっかく TypeScript を触る機会を得たので、少し勉強してみようと思います。