jsonwebtoken是node版本的JWT(JSON Web Tokens)的實現。
1.什麼是JWT?
Json web token (JWT), 是爲了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519).該token被設計爲緊湊且安全的,特別適用於分佈式站點的單點登陸(SSO)場景。JWT的聲明通常被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也能夠增長一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
傳統的認證用戶信息是用cookie-session,JWT能夠更好的實現一站式登陸。
JWT的構成:第一部分咱們稱它爲頭部(header),第二部分咱們稱其爲載荷(payload, 相似於飛機上承載的物品),第三部分是簽證(signature)。這3者是有關係的(請google),中間用.分割。
例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
2.jsonwebtoken的使用方法:
1)RSA SHA256算法:
import fs from 'fs'; import path from 'path'; const jwt = require('jsonwebtoken'); //生成token的方法 //data是保存的數據,例子:let data={uid:1} function generateToken(data){ let created = Math.floor(Date.now() / 1000); let cert = fs.readFileSync(path.join(__dirname, '../config/rsa_private_key.pem'));//私鑰 let token = jwt.sign({ data, exp: created + 3600 * 24 }, cert, {algorithm: 'RS256'}); return token; } //驗證token,最後的res。 // 上面的生成方法,咱們獲得res.uid=1 function verifyToken(token){ console.log('進入驗證'); let cert = fs.readFileSync(path.join(__dirname, '../config/rsa_public_key.pem'));//公鑰 console.log(cert); let res; try{ let result = jwt.verify(token, cert, {algorithms: ['RS256']}) || {}; let {exp = 0} = result,current = Math.floor(Date.now()/1000); if(current <= exp){ res = result.data || {}; } }catch(e){ console.log(e); } return res; }
這種用法是要私鑰和公鑰文件的。javascript
生成方法(mac os系統親測能夠):java
打開命令行工具,輸入openssl,打開openssl; 生成私鑰:genrsa -out rsa_private_key.pem 2048 生成公鑰: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
2)HMAC SHA256算法(jsonwebtoken的默認的算法)
不須要公鑰私鑰。
jwt.sign()方法只要不寫algorithms項目,就是默認的HMAC SHA256算法。