つれづれ日記
JavaScriptカテゴリ 7/7
node.js で JWT の検証をするためjsonwebtokenを使おうとしたがdecode()できなくて死んだ件。

使い方が悪いのではなく、jsonwebtokenが使っているjwsがisValidJws()で"=" を含む文字列を拒否するため通らない。具体的にはJWS_REGEXに "=" が入っていない。「base64url は base64とは違うだろ」といいたいのか、しかしREADME.mdには"RFC"という文字列がなく、きびしい。で、auth0社が運営するjwt.ioにはSignとVerifyが動作すると書いてあるのだが、これが間違い。

しかし、jsonWebTokenのREADME.meはHTTP通信をするときのサンプルがなく、とてもわかりにくい。"token invalid"というが何がinvalidかわからない。「範囲内の文字種はこれ: xxxx」とか「RFC XXXXに適合した文字種はこれ」とかならまだ調べようがある。

jsonwebtokenにプルリクするかどうかなのだけれど、JWTはピリオド "." で区切られた3つの文字列で、それぞれBase64でエンコードされているので、jwaを使ったほうがわかりやすい。ライブラリの構造はjsonwebtokenがjwsを呼び、jwsがjwaを呼んでいるのだが、jsonwebtokenが必要な理由がよくわからない。jwsはstream機能があるらしいが、JWTがストリームで巨大なデータになっているときに考えればよい。一つのJWTを検証するだけなら、node.jsのjwaモジュールでよい。

なお、jwaの文字列分解には長さの検査がない。その前に、HTTPヘッダにあるJWTを何バイト受信するつもりなのか、ということが問題か。

JavaScriptカテゴリ 7/7