1、创建一个auth中间件,可放置在最外围middleware文件夹中;
首先下载jsonwebtoken,jsonwebtoken
用于生成和验证 JSON Web Tokens (JWT) 的库。JWT 是一种开放标准(RFC 7519),用于在网络应用间传递信息的一种紧凑且自包含的方式。
JSON Web Tokens 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含描述 JWT 的元数据,例如令牌类型和所用的算法。载荷包含要传递的数据,例如用户的身份信息或其他相关信息。签名用于验证令牌的完整性和真实性。
npm install jsonwebtoken
创建auth文件:
/*
* @Author: zhang_wq
* @Date: 2023-09-05 18:15:11
* @LastEditTime: 2023-09-25 15:15:41
* @Description: jwt认证
* @FilePath: /express-node/middleware/auth.js
*/
const jwt = require('jsonwebtoken');
// 生成JWT令牌
const generateToken = (payload, options = {}) => {
const defaultOptions = { expiresIn: '1h' };
const combinedOptions = Object.assign({}, defaultOptions, options);
const token = jwt.sign(payload, secretKey, combinedOptions);
return token;
};
// 验证JWT令牌
const verifyToken = (token) => {
try {
const decoded = jwt.verify(token, secretKey);
return decoded;
} catch {
// 令牌无效或已过期
return null;
}
};
// 解码JWT令牌
const decodeToken = (token) => { return jwt.decode(token); };
// 认证中间件
const authenticate = (req, res, next) => {
const token = req.headers.authorization;
if (!token) {
return res.status(401).send('Unauthorized');
}
try {
const decoded = jwt.verify(token, secretKey);
req.user = decoded;
next();
} catch (error) {
return res.status(401).send('Unauthorized');
}
};
// 导出生成和验证 Token 的函数以及认证中间件
module.exports = {
generateToken,
verifyToken,
decodeToken,
authenticate,
};
2、用户登陆认证生成token:
通过用户名密码,去数据库做查询校验,根据用户信息生成token串
3、请求拦截:auth文件同目录创建一个interceptReq.js来进行请求的统一拦截;
app.js引入
const express = require('express');
const app = express();
const interceptReq = require('./middleware/interceptReq.js');
// 封装请求拦截
app.use(interceptReq);
/*
* @Author: 张文奇
* @Date: 2023-09-05 10:47:25
* @LastEditTime: 2023-09-06 15:26:51
* @LastEditors: mac123deMacBook-Pro.local
* @Description: 请求拦截处理
* @FilePath: /my-express-app/middleware/responseFormat.js
*/
const { apiWhiteList } = require('../utils/variable.json');
// 白名单免登陆
// "apiWhiteList": [ "/home", "/api/user/logIn" ,"/api-docs"]
const { verifyToken } = require('../middleware/auth.js');
module.exports = (req, res, next) => {
// 请求拦截是否登陆认证
const authToken = req.headers['authorization'];
if (!apiWhiteList.some(keyword => req.path.includes(keyword))) {
if (!authToken) {
return res.status(401).sendResponse({
code: '401',
data: '未登陆',
message: '未登陆用户'
});
} else {
if (verifyToken(authToken)) {
next();
} else {
return res.status(401).sendResponse({
code: '401',
data: '未登陆',
message: 'token校验失败,请重新登录'
});
}
}
} else {
next();
}
};
4、解析请求头token,获取用户信息;
const { verifyToken } = require('../middleware/auth.js');
const authToken = req.headers['authorization'];
const user = verifyToken(authToken)