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

NODE+JWT+Mongo(权限管理的简单实现)

时间:2023-04-03 20:03:43 Node.js

JWT介绍官方介绍如下:JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑且自包含的安全传输方式各方之间的信息作为JSON对象。此信息可以被验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。(JSONWebToken(JWT)是一种开放标准(RFC7519),它定义了一种紧凑且自包含的方式来在各方之间安全地传输信息作为JSON对象。此信息可以通过数字签名进行验证和信任。JWT可以使用一个秘密(使用HMAC算法)或使用RSA或ECDSA公私钥对进行签名。)目的授权和安全传输信息token的结构Header.Payload.SignatureHeader通常由两部分组成:token的类型,即JWT,和正在使用的散列算法,例如HMACSHA256或RSA。PayloadencrypteddataSignature应用知道JWT的用途后,开始结合node简单实现进行授权。版本号cnpm@6.0.0npm@6.4.1node@11.1.0流程用户未登录时,只能访问首页、注册、登录界面。登录后,他可以得到自己的信息如下图所示。如果没有输入token,会提示没有找到Token,当然可以重新定位到首页输入错误的token,提示用户不能登录。目录结构说明:config.js是全局配置文件,user.js是Mongo数据库对应的用户实体,index.js是项目入口文件。config.jsmodule.exports={'network':{'port':8080},'salt':'0vAXJ@2R%PAxL9*Y#vLc8VQuLGk0BzdD','jwtsecret':'myjwttest','database':'mongodb://127.0.0.1:27017/test'};user.jsvarmongoose=require('mongoose');varSchema=mongoose.Schema;//返回一个mongo用户库实例module.exports=mongoose.model('User',newSchema({name:String,password:String}));index.jsconstexpress=require('express');constapp=express();constcrypto=require('crypto');constutil=require('util');constbodyParser=require('body-parser');//request.body工作并使用constmongoose=require('mongoose');//MongoDBconstjwt=require('jsonwebtoken');//使用jwt签名constconfig=require('./config');//导入配置constUser=require('./user');//导入mongo用户库实例//连接mongomongoose.connect(config.database);//设置加密密钥app.set('superSecret',config.jwtsecret);//设置request.body有效app.use(bodyParser.urlencoded({extended:false}));app.use(bodyParser.json());app.listen(config.network.port);//主页应用。get('/',function(req,res){res.send('这里是首页http://127.0.0.1:'+config.network.port+"/api");});//注册应用.post('/register',asyncfunction(req,res){if(req.body.name&&req.body.password){constsalt=config.salt;constpwdEnc=awaitutil.promisify(crypto.pbkdf2)(req.body.password,salt.toString('base64'),10000,64,'sha256');varuser=newUser({name:req.body.name,password:pwdEnc});user.save(function(err){if(err)throwerr;console.log('注册成功');res.json({success:true});});}else{res.json({success:false,msg:"错误参数"});}});//登录,登录成功返回JWTToken验证用户名和密码app.post('/login',function(req,res){User.findOne({名称:req.body.name},asyncfunction(err,user){if(err)throwerr;if(!user){res.json({success:false,message:'Noauthorizeduserfound'});}elseif(user){constsalt=config.salt;constpwdEnc=awaitutil.promisify(crypto.pbkdf2)(req.body.password,salt.toString('base64'),10000,64,'sha256');if(user.password!=pwdEnc){res.json({success:false,message:'用户密码错误'});}else{vartoken=awaitutil.promisify(jwt.sign)({user:user,},app.get('superSecret'),{expiresIn:'4h',});res.json({success:true,message:'请使用您的授权码',token:token});}}});});//创建一个需要授权的接口varapiRoutes=express.Router();//验证机制apiRoutes.use(asyncfunction(req,res,next){//获取传入的tokenvartoken=req.headers['x-access-token'];if(token){//解码token获取用户信息解码为加密前的内容util.promisify(jwt.verify)(token,app.get('superSecret')).then(function(data){req.decoded=data;next();//继续下一条路线}).catch((error)=>{res.status(400).json({message:'Useris未登录',错误:错误});});}else{//没有得到令牌并返回错误returnres.status(403).send({success:false,message:'Notokenwasfound.'});}});//获取加密信息apiRoutes.get('/',function(req,res){req.decoded.user.password=undefined;res.json(req.decoded.user);});//获取所有用户apiRoutes.get('/list',function(req,res){User.find({},function(err,users){res.json(users);});});//注册API路由app.use('/api',apiRoutes);```广州路威科技Java开发团队路威科技-广州专业软件外包服务公司,提供微信小程序、APP应用开发、UI设计等专业服务,专注于互联网产品咨询、品牌设计、技术研发等领域,访问www.talkmoney.cn了解更多通用说明|早起日记精简版|凹凸壁纸|

猜你喜欢