在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失效,请重新登录'
})
}
})