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;
}
這種用法是要私鑰和公鑰文件的。
生成方法(mac os系統親測可以):
打開命令行工具,輸入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算法。
