JWT一覽

事情是這樣的:咱們作了一個小程序,在與後端 Api 交互的過程當中總要帶上個token。然而這個token過了兩小時就失效,so 咱們雖然作了處理了失效的邏輯,可是怎麼模擬失效的token呢,這一切都要從JWT提及...html

定義

JWT,JSON Web Token。通常用於 OAuth 2.0 鑑權系統中,由三部分組成,用 . 拼接:算法

  • header 定義 jwt 以及算法類型
  • payload 真正發送的數據
  • signature 由 header 與 payload 用算法生成的簽名

你看到的一個jwt多是這樣的:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTM1MDQzNTc5MTgsInVzZXIiOiJ0YW8iLCJzZXgiOjB9.Rg6jvDV2EMqtPQc2d4krpAUYC-hMtc54vSsZAuCxuKQjson

header格式:小程序

{
  "typ": "JWT",
  "alg": "HS256"
}
複製代碼

type 固定爲JWT;algorithm 表示使用的算法,經常使用的有HS256(sha-256)、RS256(rsa-256)等等後端

payload(無格式,推薦 json 形式)ui

{
  "exp": 1553504357918,
  "user": "tao"
}
複製代碼

expire 指明瞭此 token 的有效時間,除此以外 RFC 還規範了其它幾個字段好比說iss(issuer 生成者)、iat(issued at 生成時間)、jti(JWT ID 惟一標識)編碼

signature生成方式:headerpayload編碼成 base64,再用.拼接成一個字符串,最後經過 Hmac(hash-based message authentication code) 算法生成spa

hmac 與哈希算法的區別就是多了個 secret key,因此它也叫 keyed-hasing
注意:payload 中不該該放入敏感數據,諸如用戶密碼之類。由於它能直接被解碼debug

簡單的例子

const crypto = require('crypto');

// 固定格式
const header = {
  typ: 'JWT',
  alg: 'HS256',
};
// 須要傳輸的數據,也能夠是一段字符串
const payload = {
  exp: 1553504357918,
  user: tao
};
const arr = [];
// 簽名所用祕鑰
const secret = 'Zeus';

// 編碼 header 與 payload
arr.push(Buffer.from(JSON.stringify(header)).toString('base64'));
arr.push(Buffer.from(JSON.stringify(payload)).toString('base64'));

// 用 . 拼接,獲得:
// eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NTM1MDQzNTc5MTgsInVzZXIiOiJ0YW8ifQ
const encodeStr = arr.join('.');

// 生成 signature
const signature = crypto
  .createHmac('sha256', secret)
  .update(encodeStr)
  .digest('base64');

arr.push(signature);
// 最後生成的 JWT:
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTM1MDQzNTc5MTgsInVzZXIiOiJ0YW8iLCJzZXgiOjB9.Rg6jvDV2EMqtPQc2d4krpAUYC-hMtc54vSsZAuCxuKQ
arr.join('.');
複製代碼

目前 OAuth 2.0 以 JWT 形式生成的 token 比較主流,能夠了解一下~3d

參考

  1. RFC 7519 - JSON Web Token (JWT)
  2. Base64
  3. 在線 jwt 生成與校驗
相關文章
相關標籤/搜索