やりたいこと
Auth0でアクセストークンを取得した上でそれが適切なものなのか検証したい。
言語はJSもしくはTS
実装方針
アクセストークンの検証をするには公開されている証明書と署名を使って検証する。
もう少し具体的に書くとSHA256などのハッシュ関数からトークンのペイロードに含まれるMD(メッセージダイジェスト) を作成しそれが証明書と署名から作られたMDと一致するかを検証することで、トークンが改竄されたものでないことを確かめる。
調査
証明書の取得
このやりとりを見る限り https://[your_domain].auth0.com/pem
で公開鍵を取得できる模様です。
もちろん[your_domain]の部分は自身のAuth0のコンソール画面から取得してください。
Auth0コンソール→Applications->APIS->Auth0 Management API
に記載されているはずです。
証明書の検証
公開鍵の証明書を用いた署名の検証をするのにいい方法ないかなと探っているとAWSが手頃な記事を出していました。
jsonwebtoken
というライブラリを利用している模様。Cognitoのトークンの検証のために出している記事の模様ですがこの際活用させていただきます。
実装
今回実装するに当たってフォルダ構成はこんな感じにしました。
verify-auth0-token
L index.js
L public.pem
先ほどのライブラリを活用するために yarn add jsonwebtoken
もしくは npm install jsonwebtoken
でこのライブラリをインストールしてください。
今回の場合はもちろんcd verify-auth0-token
でディレクトリの移動をしてからインストールします。
先ほどの調査で取得した証明書はpublic.pemとして保存してます。
それでは index.js を記載していきます。
fs で pem ファイルを呼び込んでそれをライブラリの中に使ってトークンと一緒に突っ込みます。
const jwt = require('jsonwebtoken');
const fs = require('fs');
const pem = fs.readFileSync('./public.pem')
// token = アクセストークン
const token = 'eyJhbGc...L9CcGw'
jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) {
console.log(decodedToken)
});
あとはターミナルで実行するとコンソール上にトークンの中身が見れます。
node index.js
レスポンスはこんな感じでJSONで見れます。
実際にはトークンをAPIのリクエストで受け取ったり、証明書もバックエンドに保存しておいたり設計する必要がありますが、ひとまずこれでAuth0で公開鍵の証明書を用いた署名の検証方法を認識していただければ幸いです。
最後に
Youtubeチャンネルはじめてます!
エンジニアの姿は十人十色。
今後も色んなエンジニア像を捉えて、それを目指す人たちの参考になる動画を作っています。
あと、プログラミングもメンタで教えているので興味があったらみてください。