node js的token生成与验证之“jsonwebtoken“

11 篇文章 3 订阅

❤️在繁华中自律,在落魄中自愈❤️

知道token的都不用多介绍,在node js 中使用的时候是需要引入 jsonwebtoken。
导入包

npm install jsonwebtoken -save

一、生成token

//生成token
const generateToken = function (user) {
  let token = jwt.sign({ user }, key, { expiresIn: expir });
  return token;
}

二、验证token

// 校验token(错误会抛出异常)
const verifyToken = function (token) {
  try {
    let tokenKey = jwt.verify(token, key)
    return {
      code: 200,
      msg: '校验成功',
      tokenKey,
    }
  } catch {
    return {
      code: 100,
      msg: '校验失败'
    }
  }
}

他错误返回的值可以根据自己需求来设置,

三、完整的jwt.js 代码

// 引入模块依赖
const jwt = require('jsonwebtoken');
let key = "fuTkisMQQ2j1ESC0cbaQen1ZWmkMdvLx"
let expir = 60 * 30 //30min(token过期的时间)

//生成token
const generateToken = function (user) {
  let token = jwt.sign({ user }, key, { expiresIn: expir });
  return token;
}
// 校验token(错误会抛出异常)
const verifyToken = function (token) {
  try {
    let tokenKey = jwt.verify(token, key)
    return {
      code: 200,
      msg: '校验成功',
      tokenKey,
    }
  } catch {
    return {
      code: 100,
      msg: '校验失败'
    }
  }
}
module.exports = {
  verifyToken,
  generateToken
};

我这里的文件目录图
在这里插入图片描述

四、配合express使用token验证

首先就是引入自己封装的生成token和验证token 嘛,这里就是配置除了/api/login/api/register接口不验证tokrn,项目中请求其他的接口都会去验证token

const jwt = require('./utils/jwt');// 引入jwt token工具
app.use(function (req, res, next) {
  // 这里知识把登陆和注册请求去掉了,其他的多有请求都需要进行token校验 
  if (req.url != '/api/login' && req.url != '/api/register') {
    console.log(req.url)
    //获取请求头携带的token
    let token = req.headers.token;
    //验证token是否过期
    let result = jwt.verifyToken(token);
    // 如果验证通过就next,否则就返回登陆信息不正确(code == 100就是异常情况)
    if (result.code == 100) {
      res.send({
        code: 403,
        msg: '登录已过期,请重新登录'
      });
    } else {
      next();
    }
  } else {
    next();
  }
});

五、/api/login接口中的配置

大概过程就是在请求接口之后,会在数据库中验证账号密码的有效性,如果有效,就会返回给客户端token,不然是不会下发给客户端token的。

// 登录
app.post('/api/login', (req, res) => {
  console.log(req.route.path)
  var user = req.body.user;
  var password = req.body.password;
  let sql = `SELECT * FROM USER WHERE USER = ${user} AND PASSWORD = ${password}`
  connection.query(sql, function (error, results, fields) {
    if (error) {
      throw error
    } else {
      if (results[0]) {
        let token = jwt.generateToken(user);
        // 将 token 返回给客户端
        res.send({
          status: 200, msg: '登陆成功', token, results
        });
      } else {
        res.send({ status: 201, msg: '账号或者密码错误' });
      }
    }
  });
});

上边所有的就是服务端的配置了。我还是bibi一下前端这边的配置吧,

六、前端请求拦截器和响应拦截

请求拦截器的作用也就是在前端每一次发送请求的时候都携带token,响应拦截的话就是对些特定的响应做一些操作(个人理解,比如说token不合法的情况下可以在前端操作让他跳转到登录的界面啥的…)

这里前端使用vue.js请求用的是axios

//拦截器
axios.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
      config.headers.token = token //请求头加上token
    }
    return config
  },
  error => {
    return Promise.error(error);
  }
)

//响应拦截
axios.interceptors.response.use(response => {
  if (response.data.code == 403) {
    ElementUI.Message.error('当前登录已失效,请重新登录')
    router.replace({ path: '/login' })
  }
  return response;
}, error => {
  return Promise.reject(error.response.data)  //返回接口返回的错误信息
})

在响应拦截的时候是因为我服务端的代码是配置的code = 403 提示登录错误如图,所以我前端这边根据 code = 403来跳转页面到登录界面。
在这里插入图片描述
可以参考:https://www.jianshu.com/p/a0c67f4e145e

各位大佬看完觉得行还是点个赞加个关注再走噻!!!❤️

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codernmx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值