express结合jwt统一token鉴权

155 阅读1分钟

在app.js入口文件统一接收请求判断token是否过期

由于我的博客项目前台项目和后台项目共用一个后端,前台没有使用token鉴权,后台使用token鉴权,所以在统一接收请求判断token是否过期时,只判断请求头携带了token的请求,也就是后端的请求,所以需要前端配合在需要验证token过期的请求头的headers带上token字段,不需要验证token的就不带

思路: 在app.js所有请求之前接收请求判断token是否过期,如果没有过期就正常放行执行后面对应该请求的中间件,如果过期了就进入错误处理中间件中返回给前端响应401

express框架使用jwt鉴权,所以需要安装jsonwebtoken

npm install jsonwebtoken
//app.js后端入口文件
const express = require('express');
const app = express();
const jwt = require('jsonwebtoken')
​
//在进入路由中间件匹配之前可以拦截请求判断token是否失效(注意这部分代码必须放在所有请求的前面)
app.use(function (req, res, next) {
  let token = req.headers.token
  //通过请求头是否携带token来区分需要token鉴权和不需要token的请求
  if (token) {
    jwt.verify(token, global.secretJwt, (err, decoded) => {
      //token有效就next进入路由中间件处理 ->next()
      if (decoded) {
        //将解析后的token加到请求的user属性方便后面处理该请求的中间件使用
        req.user = decoded
        next()
      } else {
        //token失效就进入错误中间件  ->next(err)
        next({ name: 'tokenError' })
      }
    })
  } else {
    //不需要token鉴权就直接放行
    next()
  }
})
​
//...这里是路由请求中间件//错误处理中间件(放在所有请求的最后面)
app.use(function (err, req, res, next) {
  if (err.name === 'tokenError') {
    res.status(200).send({
      code: 401,
      msg: 'token失效,请重新登录'
    })
  }
})