【TypeScript版】CognitoのIDトークンのJWT検証
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
decode-verify-jwt
.well-known/jwks.json のチェックはもちろん、有効期限のチェックもされていますね。
Error で throw されると他のエラーとの区別がメッセージでしかできないので、独自の Error クラスを作るのが理想なのでしょうか。
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 と同じく、ライブラリの中でトークンの有効期限のチェックをしています。
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 のデコードのみライブラリに頼り、トークンの整合性の検証は自前で用意するのもアリ。
参考までにデコードのサンプルを書いてみます。
import jwt_decode from "jwt-decode";
type MapClaims = {
[name: string]: string;
};
const idToken = "[IDトークン]";
const claims = jwt_decode<MapClaims>(idToken);
jwt_decode がコンストラクタっぽい感じで使えるのは、default function が指定されているからなのですね。
export default function jwtDecode<T = unknown>(
token: string,
options?: JwtDecodeOptions
): T;
まとめ
TypeScript や NodeJS で利用できる JWT のトークン検証ライブラリを紹介してきました。
Cognito の利用に限定した話ではないでアレですが、トークンの検証機能は AWS の SDK に含まれていてもいいのになっと。
せっかく TypeScript を触る機会を得たので、少し勉強してみようと思います。