zoukankan      html  css  js  c++  java
  • 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,后台验证;

    最后

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

  • 相关阅读:
    【入门】WebRTC知识点概览 | 内有技术干货免费下载
    mysql数据库运维方案
    前端报504错误如何定位
    Python数据分析之双色球高频数据统计
    利用Dapper ORM搭建三层架构
    ASP.NET和IIS工作原理
    C#中的new修饰符
    .NET 三层架构的简单规划
    Docker Hub中拉取镜像时出现超时问题该如何做?
    项目组件:分页(pagination)
  • 原文地址:https://www.cnblogs.com/TaoLand/p/9463685.html
Copyright © 2011-2022 走看看