Help us understand the problem. What is going on with this article?

Cognitoユーザプール認証時のJWTトークンをjwt.toで検証してみる

More than 1 year has passed since last update.

概要

Cognito ユーザプール認証時のJWTトークンをjwt.toで検証する。

公開されているJWKから公開鍵を作ってそれで検証したいので、そういう感じでやる。
※jwt.toへJWTトークンをペーストした時点で、公開鍵が入るかもしれないけど、それはそれとして自分で公開鍵を取得する

実戦で jwt.to を使って検証することは現実的でないので、jwt.toの中で紹介されているライブラリを使用すること。

実践

Cognitoの認証~JWTトークン取得まで

  1. この記事 を参照にしてとりあえずユーザプールで認証してJWTトークンを貰う。

公開鍵取得下準備

公開鍵へはnodeを使って変換する。
JWKを公開鍵に変換するためのライブラリを入れる。

npm install jwk-to-pem --save
変換用のjavascript(後で使う)
var jwkToPem = require('jwk-to-pem')
var jwk = "/.well-known/jwks.json内のkidに対応するjwkを入れる"
pem = jwkToPem(jwk)
console.log(pem)

検証用公開鍵取得

  1. https://jwt.io/ へアクセスして、Encordedの欄に JWTトークンをコピペする。
  2. トークンの中のissのURL/.well-known/jwks.json へアクセスするとjwkを取得できる。
    公式のステップ2 参照(このURLはあくまでCognitoでの決め事)
  3. jwt.to のHEADER欄に出ている、kidと一致するJSON部分が検証用の公開鍵の元ネタになる。
    ※JWTトークンの署名の検証には署名時に使用した秘密鍵の対になる公開鍵が必要
  4. 下準備の "変換用のjavascript" 内の、var jwkに、対応するkidのJSON部分を設定する。 ※↓のような感じ
var jwk = {
    "alg": "RS256",
    "e": "AQAB",
    "kid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "kty": "RSA",
    "n": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
    "use": "sig"
}

で、jsを実行すると公開鍵が表示される。

実際に検証する

表示された公開鍵を、https://jwt.io/ の右下の "public key or certificate ..." 部分に公開鍵をペーストする。

画面下が、Signature Verified になれば検証OK。
※ならない場合は、トークンのダブルクォーテーションを消してみたりすると、動くかも。。

参考

k_hoso
記事のまとめは↓のサイトリンクから。 とりあえずevernoteにまとめていた備忘録メモを徐々にQiitaに転載していく感じ。ネタとしてひとまとめにしているものはちゃんと個別の記事にしていきたい、いつか。。ざくっとした記事もちゃんとした記事にできればいいけど、それもいつか。。 ※↓のリンクはQiita記事の目次
https://qiita.com/k_hoso/private/3c883802aa6baf9a6269
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away