質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

解決済

2回答

2915閲覧

node auth0 jwtの検証が失敗する

pokotyan

総合スコア20

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

1グッド

0クリップ

投稿2018/07/18 02:07

編集2018/07/18 03:15

auth0(https://auth0.com/)を使ってjwtを用いたログイン機能を作っています。
ログイン、ログアウト自体は正常にできるのですが、作成されたjwtをverifyメソッドで検証すると下記のエラーが返って来ます。

JsonWebTokenError {name: "JsonWebTokenError", message: "invalid algorithm", stack: "JsonWebTokenError: invalid algorithm↵ at eval (…ode_modules/redux-saga/es/internal/proc.js:398:7)"}

verifyメソッド
https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback

作成されたjwtはjwt.io(https://jwt.io/)のencodedに入れると正常にデコードされます。

コードは以下です。

// auth0の管理画面のClient Secretの値を環境変数AUTH0_SECRETに入れています。 var secret = new Buffer(process.env.AUTH0_SECRET, 'base64'); // jwtはローカルストレージにid_tokenという名前で保存しています。 jwt.verify(localStorage.getItem('id_token'), secret, (err, decoded) => { console.log(err); // JsonWebTokenErrorが発生する console.log(decoded); }); // jwtのデコードはちゃんとできる const decode = jwt.decode(localStorage.getItem('id_token')); // no error

何か原因がわかりますでしょうか?
よろしくお願いいたします。

kkeeth👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

jwtの署名のアルゴリズムにRS256を用いている場合は公開鍵を用いて検証を行う必要があるらしく、以下のurlを参考にしたところ検証が成功するようになりました。

https://auth0.com/blog/navigating-rs256-and-jwks/
https://github.com/sgmeyer/auth0-node-jwks-rs256

auth0のjwks(https://auth0.com/docs/jwks)のエンドポイントを叩くと手に入るx5cを用いて、公開鍵を生成し、それをjwt.verifyの引数に渡したところ、検証が通るようになりました。

const token = jwt.decode(localStorage.getItem('id_token'), { complete: true }); const { kid } = token.header; const { data: jwks } = yield axios.get( `https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json` ); let cert; const jwksKey = jwks.keys.find(key => key.kid === kid); //デコードされたjwtのkidとjwksのkidが一致するものを取得 cert = jwksKey.x5c[0]; cert = cert.match(/.{1,64}/g).join('\n'); cert = `-----BEGIN CERTIFICATE-----\n${cert}\n-----END CERTIFICATE-----\n`; jwt.verify(localStorage.getItem('id_token'), cert, (err, decoded) => { console.log(err); console.log(decoded); // no error });

投稿2018/07/19 05:36

pokotyan

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私の手元ですと以下のようなコードでも問題なく decoded が取得できました。

js

1jwt.verify(localStorage.getItem('id_token'), process.env.AUTH0_SECRET, (err, decoded) => { 2 console.info(err) 3 console.info(decoded) 4})

おそらく、引数の secret がBufferのインスタンスのまま渡しているのが問題かなと思います。したがって、引数を以下のように文字列に変換して渡すとどうでしょうか?

diff

1- jwt.verify(localStorage.getItem('id_token'), secret, (err, decoded) => { 2+ jwt.verify(localStorage.getItem('id_token'), secret.toString('base64'), (err, decoded) => {

投稿2018/07/18 03:51

kkeeth

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkeeth

2018/07/19 07:02

なるほど、理解しました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問