当前位置: 首页 > 后端技术 > Node.js

4.4权限拦截控制-AccessTokenjwt-blog后台Api-NodeJs+Express+Mysql实战

时间:2023-04-03 13:27:31 Node.js

权限控制业务需求:查看用户列表界面(只有管理员可以使用),更新用户信息界面(只能当前对应用户调用)。这时候需要添加中间件来实现权限控制:这时候我们需要学习和理解:AccessTokenjwtAccessTokenjwt课前了解JSONWebToken入门教程http://www.ruanyifeng.com/blo...基于jsonwebtoken(JWT)的web认证(Node版本实现)https://segmentfault.com/a/11...node-jsonwebtokenhttps://github.com/auth0/node...node-jsonwebtoken@7.2本文使用.1插件。现在附上令牌服务逻辑代码/***tokenservice*addbyboomer2019-05-0321:57:11*/varPromise=require("bluebird");varconfig=require('config-lite');//配置varjwt=require('jsonwebtoken');//jsontokenmodule.exports={/***设置令牌创建令牌*/setToken:function(payload){//varexpiresIn=Math.floor(Date.now()/1000)+(1*60);//varexpiresIn='24h';varexpiresIn=Date.now()+3600000*24;//24小时后vartoken=jwt.sign(payload,config.token.secretOrPrivateKey,{expiresIn:expiresIn,//设置过期时间});return{token:令牌,expiresIn:expiresIn,};},/***验证token是否正确:传入当前token和当前用户uuid*/verifyToken:function(token,userUuid){returnnewPromise(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自动转为小写vartoken=req.headers.accesstoken;if(!token){//如果没有token,则返回错误res.json({code:"401",});返回;}else{//验证tokenjwt.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;}elseif(!isAdmin&&tokenData.uuid&&!tokenData.isAdmin){//验证userUuid,防止普通用户登录修改其他个人数据varuserUuid=(req.body||req.query||req.params)['userUuid'];if(userUuid&&userUuid!=tokenData.uuid){res.json({code:"403",});return;}else{next();}}else{next();}}});}},/***清除令牌*/delToken:function(token){if(!token){return'delTokenFail';}else{jwt.decode(token);返回“delTokenSuccess”;}},};accessToken一般在登录/注册成功时获取,然后缓存到本地。前端每次请求时,将有效的accessToken放在headers中(后面写前端的时候会写这部分,补充updatetoken心跳机制等),然后向后端请求,后端再检查token中间件做权限拦截。验证通过后,就可以执行后续的业务逻辑了。现在,后端通过上面的tokenService.setToken方法生成AccessToken代码: