在现代 Web 应用中,用户登录系统是很常见的需求。通过使用 Express.js 和 Passport.js,我们可以轻松地构建一个安全可靠、易于扩展的用户登录系统。本文将介绍如何使用这两个工具来实现一个基本的用户登录系统,并对其中涉及的技术进行详细的介绍。
什么是 Express.js?
Express.js 是一个 Node.js 框架,用于构建 Web 应用程序和 API。它是 Node.js 生态系统中最流行的框架之一,因为它提供了一组灵活的工具和函数,使得开发人员可以快速地创建高效的 Web 应用程序。
什么是 Passport.js?
Passport.js 是一个 Node.js 的身份验证中间件。它专门用于处理用户身份验证问题,可以支持各种验证方式,例如本地验证、OAuth、OpenID 等等。Passport.js 的结构非常灵活,可以使用各种策略来实现身份验证,如使用用户名和密码、LDAP、Facebook、Google 等。
构建用户登录系统
我们将使用 Express.js 和 Passport.js 来构建一个基本的本地用户登录系统。在这个示例应用程序中,用户需要注册并登录,才能够访问受保护的资源。
步骤 1:初始化 Express.js 应用程序
首先,我们需要使用以下命令行命令安装 Express.js 和其他必要的依赖项:
--- ------- ------- --------------- -------- -------------- ----------- -------------
接下来,我们将创建一个新的 Express.js 应用程序,并用以下代码初始化它:
----- ------- - ------------------- ----- ------- - --------------------------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ---------- - ----------------------- ----- ------------ - ------------------------- ----- --- - ---------- ---------------- ------------------------ --------- ----- -- - -- ----------- ---- ----------------------------- ----- -- - -- -------- --- ----------------------------- ----- -- - -- --------- --- ------------------------ ------------------------------- --------- ---- ---- --------------------------- ----------------- ------- --------- ----- ------- ------ ------------------ ----- ---- ------------------------------- ---------------------------- ---------------- -- -- - ----------------------- ---
在这个代码中,我们初始化了一个 Express.js 应用程序,安装了几个必要的依赖项。我们还设置了 Passport.js 的本地身份验证策略,以及它所需的序列化和反序列化功能。最后,我们使用了 Express.js 内置的中间件来处理 Cookie、Body 和 Session,以及 Passport 中间件的初始化。
步骤 2:创建注册和登录页面
接下来,我们需要创建用户注册和登录页面。在本示例中,我们使用了 EJS 模板引擎,并将模板文件放置在 views
目录下。
--------- ----- ------ ------ ----- ---------------- ----------------- ------- ------ ----------- -- -- ------- - -- -------- ----- -------- -- - -- ----- ------------- ------------------- --- ------------------- ------ ----------- ---------------- ---- --- ------------------ ------ --------------- ---------------- ---- --- ------ ------------- ----------- ---- ------- ------- -------
--------- ----- ------ ------ ----- ---------------- ----------------- ------- ------ ----------- -- -- ------- - -- -------- ----- -------- -- - -- ----- ------------- ---------------- --- ------------------- ------ ----------- ---------------- ---- --- ------------------ ------ --------------- ---------------- ---- --- ------ ------------- ----------- ---- ------- ------- -------
在这两个页面中,我们提供了一个简单的表单供用户输入用户名和密码,以及一个按钮用于提交登录或注册信息。在某些情况下,我们也将显示错误消息。
步骤 3:处理用户注册和登录请求
我们还需要写一些代码来处理用户提交的注册和登录请求。我们将在 Express.js 应用程序中添加两个路由来处理这些请求。请参考下面的代码:
-------------------- ----- ---- -- - -------------------------- - ------ ------------------ --- --- --------------------- ----- ---- -- - -- ------------ --- ----------------- ----- ---- -- - ----------------------- - ------ ------------------ --- --- ------------------ ------------------------------ - ---------------- ---- ---------------- --------- ------------- ---- ----
在这个代码中,我们添加了两个 GET 路由处理用户注册和登录页面的请求,两个 POST 路由处理用户提交的注册和登录请求。
步骤 4:处理用户身份验证
在上面的代码中,我们向 Passport.js 添加了一个本地身份验证策略,该策略将在用户提交登录表单时使用。现在,我们需要编写相应的验证代码。请参考下面的代码:
---------------- ------------------------ --------- ----- -- - ----- ---- - -- ----------- --- -- ------- - ------ ---------- ------ - -------- ----------- --- - -- ------------------------------ --------------- - ------ ---------- ------ - -------- ----------- --- - ------ ---------- ------ ----
在这个代码中,我们查询数据库以查找与给定用户名匹配的用户记录。如果用户不存在,则将错误消息传递给 done
函数。否则,我们还要使用 bcrypt
库将密码哈希并与数据库中存储的密码进行比较。如果密码不匹配,则也将错误消息传递给 done
函数。如果用户名和密码都是有效的,则将用户对象传递给 done
函数。
步骤 5:处理用户会话
最后,我们需要编写代码来处理用户会话。Passport.js 具有内置的序列化和反序列化功能,这使得我们可以将用户对象存储在会话中。请参考以下代码:
----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----- ---- - -- ----------- --- -- ------ - ---------- ------ - ---- - ---------- ------ - ---
在这个代码中,我们在用户登录成功后将用户 ID 存储在会话中。当用户发起其他请求时,Passport.js 将使用反序列化功能将用户 ID 转换回用户对象。
结论
在此示例中,我们使用 Express.js 和 Passport.js 构建了一个基本的用户登录系统。这个过程中,我们学习了许多关于 Node.js、Express.js 和 Passport.js 的知识,这对于开发其他 Node.js 应用程序非常有用。我们希望这篇文章能够为初学者提供有价值的学习和指导,并使他们更加深入地理解这些技术。如果您有任何问题或反馈,请在评论中留言。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/671a13629babaf620fa0ea03