技術系TIPS
PR

【TypeScript版】CognitoのIDトークンのJWT検証

saratogax
記事内に商品プロモーションを含む場合があります

Cognito の認証で取得した ID トークン。

以前、Java のライブラリで JWT の整合性の検証を行いました。

あわせて読みたい
【Java版】CognitoのIDトークンのJWT検証とダミートークンの作成
【Java版】CognitoのIDトークンの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 を触る機会を得たので、少し勉強してみようと思います。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました