业务需求:查看用户列表接口(管理员才能使用)、更新用户信息接口(当前对应用户才能调用)
这时候须要须要加入中间件来实现权限控制:html
这时候我们须要学习了解下 :AccessToken jwt前端
课前学习了解
JSON Web Token 入门教程
http://www.ruanyifeng.com/blo...
基于jsonwebtoken(JWT) 的web认证 (Node版实现)
https://segmentfault.com/a/11...
node-jsonwebtoken
https://github.com/auth0/node...
本文中使用了node-jsonwebtoken@7.2.1插件node
现将token服务逻辑代码附上git
/** * token服务 * add by boomer 2019-05-03 21:57:11 */ var Promise = require("bluebird"); var config = require('config-lite'); //配置 var jwt = require('jsonwebtoken'); //json token module.exports = { /** * 设置token 建立token */ setToken: function(payload) { // var expiresIn = Math.floor(Date.now() / 1000) + (1 * 60); // var expiresIn = '24h'; var expiresIn = Date.now() + 3600000 * 24;//24小时后 var token = jwt.sign(payload, config.token.secretOrPrivateKey, { expiresIn: expiresIn, // 设置过时时间 }); return { token: token, expiresIn: expiresIn, }; }, /** * 验证token是否正确:传入当前token和当前用户uuid */ verifyToken: function(token, userUuid){ return new Promise(function(resolve, reject) { jwt.verify(token, config.token.secretOrPrivateKey, function(err, tokenData) { if (tokenData && tokenData.uuid == userUuid) { resolve('ok'); }else{ reject('fail'); } }); }); }, /** * 路由验证token */ verifyRouterToken: function(req, res, next, isAdmin) { //accesstoken 被自动转小写了 var token = req.headers.accesstoken; if (!token) { // 若是没有token,则返回错误 res.json({ code: "401", }); return; } else { //验证token jwt.verify(token, config.token.secretOrPrivateKey, function(err, tokenData) { //只有在token正确时tokenData有值 if (err) { res.json({ code: "402", }); return; } else { //验证是否为管理员 if (isAdmin && !tokenData.isAdmin) { res.json({ code: "403", }); return; } else if (!isAdmin && tokenData.uuid && !tokenData.isAdmin) { //验证userUuid 避免普通用户登陆修改其余人资料 var userUuid = (req.body || req.query || req.params)['userUuid']; if (userUuid && userUuid != tokenData.uuid) { res.json({ code: "403", }); return; } else { next(); } } else { next(); } } }); } }, /** * 清除token */ delToken: function(token) { if (!token) { return 'delTokenFail'; } else { jwt.decode(token); return 'delTokenSuccess'; } }, };
accessToken通常在登陆/注册成功时获取 而后缓存到本地,每次前端请求时将有效的accessToken放到headers中(这块后面写前端时补充 更新token心跳机制等),而后请求到后端,后端再经过校验token中间件作权限拦截,校验经过后才能执行后面的业务逻辑
如今说下,后端经过上面tokenService.setToken方法 生成AccessToken的代码:github