基于 Express 的 Token 令牌认证中间件与请求管理
在现代 Web 开发中,对 API 访问进行安全认证和请求管理是非常重要的一环。本文将介绍如何使用 Express 中间件来实现基于 Token 令牌的认证,以及对 CRUD 操作和异常报错进行管理。此外,还将展示如何限制 API 访问频率,并实现对一分钟内访问超过 60 次的访问者进行 IP 封禁 24 小时的功能。
Express 中间件的创建
首先,我们需要创建一个 Express 中间件,用于实现我们的功能。下面是一个示例的基本结构:
const express = require('express');
const app = express();
// Token 令牌认证中间件
const tokenAuthMiddleware = (req, res, next) => {
// 在这里进行 Token 认证逻辑
// 如果认证成功,可以将相关信息存储在 req.user 中
// 否则,可以返回认证失败的响应
next();
};
// 请求管理中间件
const requestManagementMiddleware = (req, res, next) => {
// 在这里进行 CRUD 操作和异常报错的管理逻辑
next();
};
app.use(tokenAuthMiddleware);
app.use(requestManagementMiddleware);
// 在这里定义路由和处理程序
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Token 令牌认证
Token 令牌认证是一种常见的认证方式,通过在每个请求的请求头或参数中提供有效的令牌来验证用户身份。下面是一个简单的 Token 认证实现示例:
const tokenAuthMiddleware = (req, res, next) => {
const { token } = req.headers; // 假设令牌在请求头中的字段名为 "token"
// 这里可以使用正则表达式或其他方式验证令牌的格式和有效性
if (token && isValidToken(token)) {
// 令牌验证成功,将用户信息存储在 req.user 中,供后续中间件和路由使用
req.user = getUserFromToken(token);
next();
} else {
// 令牌验证失败,返回认证失败的响应
res.status(401).json({ status: 'failure', message: 'Authentication failed' });
}
};
// 示例函数,用于验证令牌的格式和有效性
const isValidToken = (token) => {
// 使用正则表达式或其他方式验证令牌的格式和有效性
// 返回 true 或 false
};
// 示例函数,用于从令牌中提取用户信息
const getUserFromToken = (token) => {
// 从令牌中解析出用户信息
// 返回用户信息对象
};
请求管理和异常报错
请求管理中间件可以用于对 CRUD 操作和异常报错进行统一管理,以便实现更好的代码复用和错误处理。下面是一个示例的请求管理中间件:
const requestManagementMiddleware = (req, res, next) => {
try {
// 在这里进行 CRUD 操作和异常报错的管理逻辑
// 示例:处理成功的响应
res.success = (data) => {
res.json({ status: 'success', data });
};
// 示例:处理客户端错误的响应
res.clientError = (message) => {
res.status(400).json({ status: 'client_error', message });
};
// 示例:处理服务器错误的响应
res.serverError = (message) => {
res.status(500).json({ status: 'server_error', message });
};
next();
} catch (error) {
// 捕获并处理异常
res.serverError('Internal server error');
}
};
// 在路由处理程序中可以使用 res.success、res.clientError 和 res.serverError 来返回相应的响应
API 访问限制和 IP 封禁
要实现 API 访问频率限制和 IP 封禁功能,可以借助一些外部库或模块。下面是一个简单的示例,使用 Node.js 的 express-rate-limit 库来实现限制一分钟内访问超过 60 次的访问者并进行 IP 封禁 24 小时的功能:
const rateLimit = require('express-rate-limit');
// 创建限制器,设置一分钟内最多允许 60 次请求
const limiter = rateLimit({
windowMs: 60 * 1000, // 一分钟
max: 60, // 60 次请求
handler: (req, res) => {
// IP 封禁 24 小时
// 这里可以使用一些其他的库或方法实现 IP 封禁的逻辑
const { ip } = req;
banIP(ip);
res.status(429).json({ status: 'client_error', message: 'Too many requests' });
},
});
// 应用限制器到需要进行访问限制的路由
app.use('/api', limiter);
主要的优点
-
代码复用和可维护性:中间件可以被多个路由共享,从而实现代码的复用。通过将共同的功能逻辑提取到中间件中,可以避免在每个路由处理程序中重复编写相同的代码。这样可以提高代码的可维护性,减少重复工作,并使代码更加清晰和易于理解。
-
请求流程控制:中间件可以控制请求的流程,允许在请求到达路由处理程序之前或之后进行操作。这使得我们可以在请求处理之前进行一些预处理或验证操作,以确保请求的合法性、安全性或完整性。同样,也可以在请求处理完成后进行一些后续操作,如日志记录、错误处理等。
-
错误处理和异常管理:中间件提供了一个集中处理错误和异常的机制。通过在中间件中捕获错误并进行统一的处理,我们可以避免在每个路由处理程序中编写繁琐的错误处理代码。这样可以提高代码的可读性和可维护性,并且可以更好地管理应用程序中的异常情况,例如数据库连接错误、网络错误等。
-
认证和授权:中间件非常适合用于实现认证和授权逻辑。例如,在使用 Token 令牌进行身份验证时,可以编写一个认证中间件,在每个受保护的路由中使用该中间件进行认证检查。这样可以将认证逻辑与路由处理程序分离,提供更高的灵活性和安全性。
-
请求管理和流量控制:中间件可以用于对请求进行管理和控制。例如,可以使用中间件来限制请求的频率,防止恶意攻击或过载服务器。中间件还可以用于记录请求日志、实施缓存策略、实现数据转换或格式化等。
结论
理解和学会,并准确使用中间件进行管理会让你的代码有质的飞越,中间件是 Express 框架中非常强大和灵活的功能之一,可以用于实现各种通用的功能和管理机制。它们提供了一种优雅的方式来组织和管理应用程序的功能,并提高代码的可重用性、可维护性和可扩展性。
转载自:https://juejin.cn/post/7244106756677337147