中间件功能是可以访问请求对象(REQ),响应对象(RES)和应用程序请求响应周期中的下一个功能的功能。
-Expressjs.com
欢迎来到博客文章,我们将在其中揭开有趣的中间件世界以及如何转化为Web应用程序的“弹跳器”!想象一下,您的Web应用程序就像是一家繁华的夜总会,您作为应用程序所有者,要确保只有VIP访客(经过身份验证的用户)才能访问独家聚会。那是中间件介入的地方,就像驻扎在俱乐部入口处的警惕弹跳器一样。在这篇文章中,我们将探讨中间件如何充当保安人员,管理谁加入(认证的用户)以及谁被转身(未经授权的访问者)。
什么是中间件?
在使用ExpressJS之类的框架的Web开发的上下文中,中间件是一种特殊的功能,它位于客户端的传入请求与服务器发送的响应之间。它有能力在到达主要路由处理程序之前拦截和处理请求。这种巧妙的功能使开发人员可以在其应用程序中添加额外的功能,安全措施或自定义逻辑,而无需混乱主代码。这也将帮助开发人员维护干燥的代码。
身份验证中间件
身份验证中间件用于在授予对某些路线或资源的访问之前检查用户是否已进行身份验证(登录)。当用户向受保护的路线提出请求时,身份验证中间件将在路由处理程序之前执行。中间件检查了确定用户是否已验证的请求。如果用户经过身份验证,则中间件允许请求继续进行路由处理程序。如果未对用户进行身份验证,则中间件可以将用户重定向到登录页面,返回错误响应或采取其他适当的操作。在研究实际创建authMiddleware
之前,我们需要简要讨论不同的身份验证策略。
身份验证策略
尽管对OAuth2或Passport等进行身份验证时有几种策略,但为了简单起见,我们将使用express-session(session)。请参阅有关如何在环境中正确设置会话的链接。
创建身份验证中间件
首先,我们需要创建一个将处理身份验证逻辑的中间件功能。在我们的情况下,中间软件功能通常检查是否存在身份验证数据:会话。正如我先前从Abiaoqian引用的那样,中间件功能可以访问req
,res
对象以及next
函数。 next
函数(按照惯例称为“下一步”)(expressjs.com)是Express提供的回调,允许中间件功能将控制传递到链条中的 Next 中间件或路由处理程序。当调用时,它将请求传递到 next 函数,并继续通过中间件堆栈的执行流。如果中间软件中未调用next
,则可能会悬挂该请求,并且不会执行后续中间件或路由处理程序。
// in a separate location: ../middlewares/authentication.js
const authMiddleware = (req, res, next) => {
// Check if the user has an active session
if (req.session && req.session.user) {
next();
} else {
//User does not have an active session, redirect to login page
res.redirect('/login');
}
};
module.exports = authMiddleware;
此中间件在允许访问受保护的路由之前检查用户是否具有活动会话(表明他们已进行身份验证)。如果用户没有活动会话,则将其重定向到登录页面。在此示例中,我们假设req.session.user
对象在成功登录后包含用户信息。当用户使用正确的凭据登录时,我们将在登录过程中使用必要的用户数据(例如用户名,user_id)设置req.session.user
。
实施中间件
现在,我们已经创建了保镖,我们接下来需要将其包括在需要VIP徽章的所有路线中。首先,让我们看一下标准GET
请求的语法:
const express = require('express');
const router = express.Router();
router.get('/VIPdata', (req, res) => {
res.render('vipData');
});
module.exports = router;
此代码设置了一个ExpressJS服务器,该服务器在提出请求时在URL路由'/VIPdata'.
上聆听GET
请求,该服务器通过呈现“ VIPDATA”页面来做出响应。任何人都可以进入VIP部分并查看您的数据!
现在,让我们看一下添加中间软件的语法。尽管我们本可以在GET
请求中使用无名功能,但干燥代码的最佳实践是建立一个命名函数,然后在需要它的任何路线中require
。
const express = require('express');
const router = express.Router();
const authMiddleware = require('../middlewares/authentication');
// Our middleware sits between the route, and the route logic
router.get('/VIPdata', authMiddleware, (req, res) => {
res.render('vipData');
});
module.exports = router;
现在,该路由受我们的身份验证中间件(导入为authMiddleware
),以确保只有身份验证的用户才能访问它。当向“/vipdata”请求时,服务器会呈现“ vipdata”视图,允许身份验证的用户访问受保护的VIP数据。
结论:
总而言之,我们已经进入了Expressjs身份验证中间件的迷人领域,在那里我们发现了这些“弹跳者”的力量来保护我们的Web应用程序。就像警惕的哨兵一样,身份验证中间件可确保只有信任的用户可以访问我们应用程序的专有部分。有了这些宝贵的见解,我们现在有能力自信地保护我们的Web应用程序,使用户可以陶醉于他们应有的独特和个性化的体验。因此,前进,拥抱身份验证中间件的力量,让您的明确应用程序以增强的安全感和用户满意度发光!
-josh