node使用JsonWebToken|node使用JsonWebToken 生成token,完成用户登录、登录检测

最近在用node做后台的登录,检测登录功能。在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因。原来,自己项目是前后端分离的,前端调用后端api接口,因此使用cors = require('cors')来解决了跨域问题,而跨域对于cookie来说,就是两个不同的网站,因此session会不停的变。
起因
最近在用node做后台的登录,检测登录功能。在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因。原来,自己项目是前后端分离的,前端调用后端api接口,因此使用cors = require('cors')来解决了跨域问题,而跨域对于cookie来说,就是两个不同的网站,因此session会不停的变。
解决方法
  • 设置一个nginx或者什么别的来做一下转发,避免跨域。可以弄一个nginx,设置8080,然后app指向3000,api指向1994。
  • 不使用session,而使用token来做api请求
使用token
  • 导入模块
    npm install jsonwebtoken
  • 后台生成token并存入数据库里
//api.js //登录 router.post('/api/admin/signIn',(req, res)=>{ db.User.find({ name: req.body.name,password: req.body.password},(err, docs)=>{ if (err) { res.send(err); return } if(docs.length>0){ let content ={name:req.body.name}; // 要生成token的主题信息 let secretOrPrivateKey="suiyi" // 这是加密的key(密钥) let token = jwt.sign(content, secretOrPrivateKey, { expiresIn: 60*60*1// 1小时过期 }); docs[0].token = token//token写入数据库 db.User(docs[0]).save(function (err) { if (err) { res.status(500).send() return } res.send({'status':1,'msg':'登陆成功','token':token,'user_name':req.body.name})//反给前台 }) }else{ res.send({'status':0,'msg':'登录失败'}); } }) })

  • 前台就可以获得token并存入localStorage了
//signin.vue this.$axios.post(webUrl+'api/admin/signIn', {'name': this.name, 'password': this.password}) .then((response) => { if(response.data.status==1){ localStorage.setItem('token', response.data.token); localStorage.setItem('user_name', response.data.user_name); }else{ alert(response.data.msg) } }) .catch((reject) => { console.log(reject) })

  • 后台检测token
//检测token //api.js router.post('/api/admin/checkUser',(req, res)=>{ db.User.find({ name: req.body.user_name,token: req.body.token},(err, docs)=>{ if (err) { res.send(err); return } if(docs.length>0){ let token = req.body.token; // 从body中获取token let secretOrPrivateKey="suiyi"; // 这是加密的key(密钥) jwt.verify(token, secretOrPrivateKey, function (err, decode) { if (err) {//时间失效的时候/ 伪造的token res.send({'status':0}); } else { res.send({'status':1}); } }) }else{ res.send({'status':0}); } }) })

  • 前台每次调用checkUser来检测登录就可以了,也可以每个接口都传token,后台验证;
最后
【node使用JsonWebToken|node使用JsonWebToken 生成token,完成用户登录、登录检测】大家好,这里是「 TaoLand 」,这个博客主要用于记录一个菜鸟程序猿的Growth之路。这也是自己第一次做博客,希望和大家多多交流,一起成长!文章将会在下列地址同步更新……
个人博客:www.yangyuetao.cn
小程序:TaoLand

    推荐阅读