Rso's Jotter

日々の開発の知見のメモやその他雑記

jsonwebtokenでAuth0で発行されたJWTを検証する

掲題の対応でWebで調べてもすぐに出なかったのでメモしておきます。

Auth0とFirebaseを連携させたいときに、まずCloud Functionで Auth0で発行されたJWTの検証を 行おうと思ったのですが、その手順と調べた内容です。

Auth0公式に方法がざっくり書いています。

auth0.com

大きく3つ方法があり、

  • ASP.NET Coreのようなミドルウェアを使う。
  • jwt.ioが提供しているライブラリを使う。
    • nodeを使うなら jsonwebtoken というライブラリでいいよ
  • 自前で検証処理を実装する。

とのことです。 今回はCloud Function上で検証がしたいので、node-jsonwebtoken のライブラリを使用することにします。

github.com

これを見ると、 ここjwt.verify(token, secretOrPublicKey ...) という関数が用意されているので、これを使用すれば良さそうです。 tokenが 検証したいJWT, secretOrPublicKeyは シークレットもしくは公開鍵を入れるようです。 今回JWTの生成アルゴリズムがRSA256だったので、公開鍵を入れる必要がありそうです。

この公開鍵は、Auth0 は JWKs という形式で配っているそうです。

auth0.com

↑を読むと、 https://YOUR_DOMAIN/.well-known/jwks.json にGETするとJWKsが返ってくるようです。

しかしこれはそのままでは公開鍵としては使えないようです。

適当にggるとどうやらjwkから公開鍵を生成してやらないと行けないようです。 jwk-to-pemというライブラリがあったので、そちらを使います。

const jsonwebtoken = require('jsonwebtoken')
const jwkToPem = require('jwk-to-pem');
const pem = jwkToPem(jwk) // jwk は auth0からGETしたjwksの1つ
const result = jsonwebtoken.verify(jwt, pem)

みたいな感じで無事検証できました。

追記

このメモを書いた後で見つけたのですが、 "jwks-rsa" というライブラリもあって、こちらを使ったほうが楽だったかもです。

github.com

所感

公式ではサラッと書いていましたが、 jwksがどこにあるのや、そこから公開鍵を生成しないといけないなど、 基本が分かっていなかったので、少々手間取りました。 似たような問題でつまづくケースがあるかもなので、残しておきました。