node jsonwebtoken
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算法。