分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

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

发布时间:2023-09-06 02:07责任编辑:顾先生关键词:Web

最近在用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.jsrouter.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,后台验证;

    最后

    大家好,这里是「 TaoLand 」,这个博客主要用于记录一个菜鸟程序猿的Growth之路。这也是自己第一次做博客,希望和大家多多交流,一起成长!文章将会在下列地址同步更新……
    个人博客:www.yangyuetao.cn
    小程序:TaoLand

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

原文地址:https://www.cnblogs.com/TaoLand/p/9463685.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved