Node.js express, axios で JWT の利用(発行/利用/検証)
はじめに
Node.js, express, axios で JWT(JSON Web Tokens) を利用する方法を整理した。
ざっくり以下の流れ。
- ログイン時にサーバで Token を 発行/送付
- クライアントが API 利用時に Token を Request Headers なり Body なりで送付
- サーバ側で Token の正当性を検証
TL;DR
- auth0/node-jsonwebtoken を使用
sign()
で JWT 発行- axios/axios の
config
に{ headers: { Authorization: `Bearer ${token}` } }
で設定 verify()
で JWT 検証app.use()
で JWT 検証処理を定義
目次
環境・条件
1 | $ cat /etc/os-release |
詳細
全体の流れ
- ログイン時にサーバで Token を 発行/送付
- クライアントが API 利用時に Token を Request Headers なり Body なりで送付
- サーバ側で Token の正当性を検証
前置き
JWT(JSON Web Tokens) とは
詳しくは参考サイト参照。
- JSON Web Tokens - jwt.io
- JSON Web Token(JWT)の紹介とYahoo! JAPANにおけるJWTの活用 - Yahoo! JAPAN Tech Blog
- JSON Web Token の効用 - Qiita
- 【JWT】 入門 - Qiita
express で JWT を使う方法
express で JWT を使う主な方法として、auth0/express-jwt と auth0/node-jsonwebtoken とがある。
今回は以下の理由から auth0/node-jsonwebtoken を使った。
- Token に有効期限を持たせたい
- 有効期限切れや検証エラー時の挙動を細かく制御したい
- ↑の方法を auth0/express-jwt の Document から見つけきれず
auth0/node-jsonwebtoken の使い方
セットアップ
npm i
でインストール
1 | $ npm i jsonwebtoken |
JWT の発行
sign(payload, secretOrPrivateKey, [options, callback])
で JWT の発行。
payload
: 暗号化対象secretOrPrivateKey
: Token の 暗号化/検証 に使うキーoptions
: アルゴリズム(algorithm
)とか期限(expiresIn
)などを設定可能
1 | const jwt = require('jsonwebtoken'); |
expiresIn
の時間指定は zeit/ms の記法が利用可能。
1 | // https://github.com/zeit/ms#examples より |
ログイン時に JWT を 発行/送付
1 | const jwt = require('jsonwebtoken'); |
JWT の利用
ログイン成功時に受け取った JWT を Store あたりに保持しておく。
以下は Request Headers の Authorization に Bearer <token>
で送る場合の例。
(見ればわかるが) API 実行は axios/axios を使っている。
1 | const axios = require('axios'); |
Token の送付方法に関しては トークンを利用した認証・認可 API を実装するとき Authorization: Bearer ヘッダを使っていいのか調べた - Qiita も合わせて見ておいた方が良い。
JWT の検証
検証自体は verify(token, secretOrPublicKey, [options, callback])
で行う。
1 | const jwt = require('jsonwebtoken'); |
Request Headers の Authorization: Bearer <token>
で送られてきた場合の例。
1 | const jwt = require('jsonwebtoken'); |
↑のやり方だと、全ての API に Token の検証処理を実装しないといけないので、 use
で別途検証処理を定義する。
検証処理以前に定義した API は JWT 検証処理は無し。検証処理以降に定義した API は JWT 検証処理が行われる。
1 | // JWT 検証が不要なものは検証処理前に定義 |
まとめ
- auth0/node-jsonwebtoken を使用
sign()
で JWT 発行- axios/axios の
config
に{ headers: { Authorization: `Bearer ${token}` } }
で設定 verify()
で JWT 検証app.use()
で JWT 検証処理を定義
参考文献
- JWT について
- Node.js での使い方関係
- auth0/node-jsonwebtoken: JsonWebToken implementation for node.js http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
- auth0/express-jwt: connect/express middleware that validates a JsonWebToken (JWT) and set the req.user with the attributes
- axios/axios: Promise based HTTP client for the browser and node.js
- Express.jsでJSON WEB TOKEN(JWT)の設定を行う | アールエフェクト
- nodejs: Express と JWT (JSON Web Token) をできるだけシンプルに使う - nju33
- Node(Express)でJWT - Qiita
- node.js/expressでユーザ認証with JWT - Qiita
- JWT(JSON Web Token)を使った認証を試みる | 69log
- その他
関連記事
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- axios で unable to verify the first certificate の対応方法
- Cordova iOS axios で Network Error となる場合の回避策
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- ツールチップを簡単に表示できる Tippy.js の使い方
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア