掲題の対応でWebで調べてもすぐに出なかったのでメモしておきます。
Auth0とFirebaseを連携させたいときに、まずCloud Functionで Auth0で発行されたJWTの検証を 行おうと思ったのですが、その手順と調べた内容です。
Auth0公式に方法がざっくり書いています。
大きく3つ方法があり、
- ASP.NET Coreのようなミドルウェアを使う。
- jwt.ioが提供しているライブラリを使う。
- nodeを使うなら jsonwebtoken というライブラリでいいよ
- 自前で検証処理を実装する。
とのことです。 今回はCloud Function上で検証がしたいので、node-jsonwebtoken のライブラリを使用することにします。
これを見ると、 ここ に
jwt.verify(token, secretOrPublicKey ...)
という関数が用意されているので、これを使用すれば良さそうです。
tokenが 検証したいJWT, secretOrPublicKeyは シークレットもしくは公開鍵を入れるようです。
今回JWTの生成アルゴリズムがRSA256だったので、公開鍵を入れる必要がありそうです。
この公開鍵は、Auth0 は JWKs という形式で配っているそうです。
↑を読むと、 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" というライブラリもあって、こちらを使ったほうが楽だったかもです。
所感
公式ではサラッと書いていましたが、 jwksがどこにあるのや、そこから公開鍵を生成しないといけないなど、 基本が分かっていなかったので、少々手間取りました。 似たような問題でつまづくケースがあるかもなので、残しておきました。