随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息。随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单
JSON Web Token由三部分组成,它们之间用圆点(.)连接,header.payload.signature
header存token类型和签名算法
payload存携带的数据,比如用户信息{id:1,name:‘txj’…},其中一些是: iss(发行人)、 exp(到期时间)、 sub(主题)、 aud(受众)
signature存签名,默认使用HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)
1、创建
$ npm install jsonwebtoken --save
jsonwebtoken用于创建和验证token
使用默认的HMAC SHA256生成
var jwt = require('jsonwebtoken');
var token = jwt.sign({
foo: 'bar' }, 'secret_shhhhh');
设置过期时间(1h过期)
// 方式一
jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
// 方式二 推荐使用
jwt.sign({
data: 'foobar'}, 'secret', {
expiresIn: '1h' });
'1h’表示1小时过期
'7d’表示7天过期
数字1000表示1000毫秒过期
如果没有配置过期时间,则默认永不过期
eg:登录获取token
router.post('/token', async (ctx, next) => {
let columnNames = ['admin_id','role_id','user_name','real_name','nick_name','portrait']
let sql = `SELECT ${
columnNames.join()} FROM admin WHERE user_name = ? AND password = ?`
const md5Password = md5(password).toString()
// 查不到数据时rows=[]
const [rows,fields] = await mysqlPool.execute(sql, [userName,md5Password]);
if(rows[0]){
console.log('login success')
// 创建token
const token = jwt.sign