在前端开发中,用户认证是一个非常基础和重要的功能。在 Node.js 中,使用 Cookie 和 Session 进行用户认证是非常常见和方便的方法。本文将详细介绍 Cookie 和 Session 的概念、用法以及如何在 Node.js 中使用它们进行用户认证。
Cookie 与 Session 的概念
Cookie
Cookie 是一种存储在客户端的简单的文本文件,它通常用于跟踪用户的会话信息。当用户访问网站时,服务器可以在响应头中设置 Cookie,这样客户端就可以存储这个 Cookie,并在未来的请求中发送给服务器。这个过程可以让服务器在用户多次访问同一网站时,能够识别出这个用户。
Session
Session 是服务器用来存储用户信息的一种机制。当用户首次访问网站时,服务器可以为该用户创建一个新的 Session,并为其分配一个唯一的 Session ID。服务器在响应头中设置这个 Session ID,并在用户未来的请求中进行验证和识别。Session 信息可能包含用户的登录状态、购物车信息等。
Cookie 和 Session 的差异
尽管 Cookie 和 Session 都能用于存储用户信息,但它们的工作方式有所不同。具体来说:
- Cookie 存储在客户端,Session 存储在服务器端。
- Cookie 可以持久化存储,即设置过期时间,而 Session 通常在用户关闭浏览器或 Session 过期时停止。
- Cookie 的数据传输相对不安全,因为客户端能够查看和修改 Cookie。而 Session 由于存储在服务器上,相对更加安全。
在 Node.js 中使用 Cookie 进行用户认证
下面是一个带有用户认证功能的 Node.js 示例代码,使用 Cookie 进行用户认证。
前端页面
(1)登录页面
-- -------------------- ---- ------- --------- ----- ------ ------ ----- --------------- -- -------------------- ------- ------ ----- ------------- ---------------- ------ -------------------------------- ------ ----------- ------------- --------------- ----- -- ------ -------------------------------- ------ --------------- ------------- --------------- ----- -- ------- ---------------------------- ------- ------- -------
(2)已登录页面
-- -------------------- ---- ------- --------- ----- ------ ------ ----- --------------- -- ---------------------- ------- ------ ------------ ------------------ ----- ----------------------------- ------- -------
后端代码
(1)引入依赖
const express = require("express"); const cookieParser = require("cookie-parser"); const bodyParser = require("body-parser"); const app = express(); app.use(cookieParser()); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json());
(2)设置登录和验证请求
-- -------------------- ---- ------- ----- ----- - - - --- -- --------- -------- --------- ------- -- - --- -- --------- -------- --------- ------- -- -- ------------------ ----- ---- -- - ----- - --------- -------- - - --------- ----- ---- - ----------- --- -- ---------- --- -------- -- ---------- --- -------- -- -- ------ - --------------------- --------- ------------------ - ---- - -------------------- - --- ------------ ----- ---- -- - ----- ---- - -------------- -- ---- --- --------------------- -- ------ - ---------------------- ------------------------- - ---- - ----------------------- - ---
(3)设置登出请求
app.get("/logout", (req, res) => { res.clearCookie("user_id"); res.redirect("/login"); });
这段代码中,我们使用 cookie-parser
中间件解析 Cookie,并使用 body-parser
中间件解析 POST 请求。当用户登录成功后,服务器会在响应中设置一个名为 “user_id” 的 Cookie,存储用户的 ID。当用户访问首页时,服务器会读取这个 Cookie,并验证用户信息。如果用户未登录,则重定向到登录页面。
当用户点击登出时,服务器会删除相应的 Cookie,并重定向到登录页面。
在 Node.js 中使用 Session 进行用户认证
在 Node.js 中使用 Session 进行用户认证的基本流程与使用 Cookie 类似。不同的是,我们需要在服务器端创建并管理 Session,并使用某种方法将 Session ID 与用户相关联。
下面是一个使用基于 express-session 的中间件实现用户认证的示例代码。
引入依赖
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------- - --------------------------- ----- ---------- - ----------------------- ----- --- - ---------- -------- --------- ------- -------------- ------- ------ ------------------ ----- -- -- ------------------------------- --------- ----- ---- ---------------------------
这里使用的是 express-session
中间件实现 Session 功能,其中:
secret
用于加密生成的 Session ID。resave
表示是否在每次请求时都重新保存 Session。saveUninitialized
表示是否自动保存未初始化的 Session。
设置登录和验证请求
-- -------------------- ---- ------- ----- ----- - - - --- -- --------- -------- --------- ------- -- - --- -- --------- -------- --------- ------- -- -- ------------------ ----- ---- -- - ----- - --------- -------- - - --------- ----- ---- - ----------- --- -- ---------- --- -------- -- ---------- --- -------- -- -- ------ - ------------------- - -------- ------------------ - ---- - -------------------- - --- ------------ ----- ---- -- - ----- ---- - -------------- -- ---- --- --------------------- -- ------ - ---------------------- ------------------------- - ---- - ----------------------- - ---
这段代码与上一个示例类似,在用户登录成功后创建了一个名为 “user_id” 的 Session,并在 Web 应用程序中保存了该 Session ID。当用户访问首页时,服务器可以通过这个 Session ID 验证用户信息,并相应地构建页面。
设置登出请求
app.get("/logout", (req, res) => { req.session.destroy((err) => { if (err) { console.error(err); } res.redirect("/login"); }); });
session.destroy()
方法用于删除当前 Session,并在回调函数中执行跳转操作。需要注意的是,执行 Session 销毁时,我们需要传递参数为回调函数,以确保 Session 销毁完成后才能回调完成。
总结
通过本文的介绍,我们了解了 Node.js 中使用 Cookie 和 Session 实现用户认证的基础概念和流程。相比于 Cookie,Session 更加安全,但也需要更多的服务器资源来存储和管理。在实际应用中,我们可以根据需求灵活选择。希望本文能对大家学习 Node.js 和实现用户认证有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ca33fc5ad90b6d041a0d77