权限控制
业务需求:查看用户列表接口(管理员才能使用)、更新用户信息接口(当前对应用户才能调用)
这时候需要需要加入中间件来实现权限控制:
这时候咱们需要学习了解下 :AccessToken jwt
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插件
现将token服务逻辑代码附上
/** * token服务 * add by boomer 2019-05-03 21:57:11 */var Promise = require("bluebird");var config = require('config-lite'); //配置var jwt = require('jsonwebtoken'); //json tokenmodule.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中间件做权限拦截,校验通过后才能执行后面的业务逻辑(这块后面写前端时补充)
现在说下,后端通过上面tokenService.setToken方法 生成AccessToken的代码: