Khi ứng dụng web của bạn cần “nhớ” người dùng, nó thường sử dụng một trong hai cơ chế: cookie hoặc phiên. Cookie là một vùng lưu trữ nhỏ trong trình duyệt, nơi bạn có thể giữ dữ liệu liên quan đến người dùng như tùy chọn tìm kiếm chẳng hạn. Thay vào đó, phiên cho phép bạn lưu trữ thông tin nhạy cảm trên máy chủ.
Khám phá cách thiết lập phiên trong máy chủ Express do Node.js cung cấp.
Những gì bạn cần
Để làm theo hướng dẫn này, bạn cần cài đặt cả Node.js và npm. Mọi phiên bản gần đây của Node.js đều phải đi kèm với npm, trình quản lý gói để cài đặt các phần phụ thuộc.
Bạn sẽ sử dụng npm để cài đặt Express và express-session. Đây là những công cụ bạn sẽ sử dụng để tạo máy chủ web và phiên.
Phiên trong Node.js là gì?
Cookie là một tệp nhỏ mà trình duyệt của bạn sử dụng để lưu trữ dữ liệu. Bạn có thể sử dụng cookie để lưu trữ dữ liệu không nhạy cảm như tùy chọn tìm kiếm.
Bạn không nên lưu trữ dữ liệu nhạy cảm (chẳng hạn như tên người dùng và mật khẩu) trong cookie. Khi trình duyệt của bạn gửi cookie qua HTTP, chúng dễ bị tin tặc tấn công và có thể chặn chúng. Chúng cũng được lưu trữ ở dạng văn bản thuần túy trên máy tính của bạn, vì vậy tin tặc có thể kiểm tra chúng và đánh cắp dữ liệu của bạn.
Thay vì lưu dữ liệu nhạy cảm dưới dạng cookie trên máy khách, bạn nên lưu trữ nó trên máy chủ. Điều này giữ cho nó được bảo vệ khỏi thế giới bên ngoài.
Phiên cho phép bạn lưu trữ dữ liệu nhạy cảm mà ứng dụng của bạn cần để nhận dạng người dùng. Ví dụ như tên người dùng, mật khẩu và email. Chúng an toàn hơn vì chúng sống trên máy chủ chứ không phải máy khách.
Bất cứ khi nào bạn có dữ liệu mà bạn muốn duy trì trong các yêu cầu, hãy lưu dữ liệu đó ở phía máy chủ bằng một phiên. Bạn sẽ tìm hiểu cách tạo phiên trong phần sau.
Tạo phiên trong Express Server
Express là một khung web phổ biến cho Node.js. Nó cho phép bạn thiết lập một ứng dụng máy chủ web lắng nghe các yêu cầu của máy khách tại số cổng bạn đã chọn. Bạn có thể tạo các tuyến API, áp dụng phần mềm trung gian và thậm chí kết nối ứng dụng với cơ sở dữ liệu, tất cả đều nhờ vào các API do khung cung cấp.
1. Tạo Dự án Node.js
Tạo một thư mục hoàn toàn mới cho dự án của bạn, sau đó khởi chạy công cụ dòng lệnh và cd vào thư mục đó.
Tiếp theo, hãy chạy lệnh sau để khởi tạo dự án Node.js:
npm init -y
Điều này tạo ra một tệp pack.json trong thư mục gốc của dự án với thiết lập mặc định. Tệp pack.json để chạy tập lệnh npm.
2. Cài đặt Express và express-session
Bạn sẽ sử dụng Express để tạo ứng dụng máy chủ web. Và express-session để tạo phiên trên ứng dụng máy chủ đó.
Trên thiết bị đầu cuối, hãy chạy lệnh sau để cài đặt cả hai phụ thuộc:
npm i express express-session
Sau khi cài đặt cả hai gói, bước tiếp theo sẽ là tạo máy chủ.
3. Tạo phiên trong ứng dụng
Tạo một tệp có tên App.js trong thư mục gốc của dự án của bạn và nhập các phụ thuộc:
const express = require('express')
const session = require('express-session')
app = express()
Tiếp theo, đăng ký phần mềm trung gian phiên. Truyền vào một đối tượng với bí mật thuộc tính (để ký cookie sessionID) và cookie.
app.use(
session({
secret: "some secret",
cookie: { maxAge: 30000 },
saveUninitialized: false,
})
);
Tại đây, bạn đặt độ tuổi lớn nhất của phiên là 30 giây (30000 mili giây). Đặt saveUnitialized thành false là điều cần thiết nếu bạn có hệ thống đăng nhập. Nếu bạn không làm như vậy, máy chủ của bạn sẽ tạo một sessionID mới mỗi khi người dùng gửi yêu cầu.
Tiếp theo, tạo một tuyến đăng nhập để thay đổi phiên. Khi người dùng truy cập tuyến đường này, bạn mong muốn khách hàng gửi tên người dùng và mật khẩu trong phần thân yêu cầu. Đầu tiên, bạn truy cập các giá trị này và kiểm tra xem chúng có tồn tại không (và người dùng đã được xác thực chưa):
app.post("/login", (req, res) => {
const { username, password } = req.body;
if (username && password) {
if (req.session.authenticated) {
res.json(session);
} else {
if (password === "123") {
req.session.authenticated = true;
req.session.user = { username };
res.json(req.session);
} else {
res.status(403).json({ msg: "Bad credentials" });
}
}
} else {
res.status(403).json({ msg: "Bad credentials" });
}
});
Với câu lệnh if đầu tiên, bạn thực hiện kiểm tra giả. Việc kiểm tra này nhằm đảm bảo rằng bạn chỉ tiếp tục nếu có tên người dùng và mật khẩu.
Tiếp theo, bạn kiểm tra xem người dùng đã được xác thực chưa. Nếu vậy, hãy gửi lại phiên cho khách hàng. Nếu không, hãy đặt thuộc tính đã xác thực thành true và lưu tên người dùng vào phiên. Sau đó gửi lại cho khách hàng.
Với đoạn mã trên, máy chủ sẽ ghi nhớ từng người dùng gửi yêu cầu đến máy chủ. Điều này là do họ đã xác thực và đã lưu các chi tiết duy nhất của họ (tên người dùng và mật khẩu) trong phiên.
Khởi động máy chủ của bạn bằng cách thêm đoạn mã sau vào cuối App.js:
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
Để kiểm tra lộ trình này, hãy sử dụng ứng dụng khách API để gửi yêu cầu đến lộ trình đăng nhập mà bạn đã tạo. Đảm bảo gửi tên người dùng và mật khẩu trong phần thân của yêu cầu. Đây là cách yêu cầu API của bạn sẽ như thế nào nếu sử dụng Rest Client:
POST http:
Content-Type: "application/json"
{ username: "Kingsley", password: "123"}
Nếu mọi thứ suôn sẻ, bạn sẽ nhận được đối tượng sau:
{
"cookie": {
"originalMaxAge": 30000,
"httpOnly": true,
"path": "https://www.smartreviewaz.com/"
},
"authenticated": true,
"user": {
"username": "Kingsley",
"password": "123"
}
}
Với mã này, hai điều đã xảy ra. Đầu tiên, bạn đã xác thực trên máy chủ. Thứ hai, phiên hiện có chi tiết đăng nhập của bạn, vì vậy máy chủ hiện biết bạn là ai. Bất cứ khi nào bạn gửi một yêu cầu mới, nó sẽ ghi nhớ bạn cho đến khi hết phiên và máy chủ sẽ xóa yêu cầu đó.
Phiên cải thiện trải nghiệm người dùng
Phiên là một phần quan trọng của các ứng dụng Node.js. Điều này là do chúng cho phép bạn duy trì trạng thái tương tác qua nhiều yêu cầu và phản hồi. Phiên đặc biệt quan trọng đối với các ứng dụng cần bạn đăng nhập.
Sử dụng các phiên trong ứng dụng phụ trợ của bạn để theo dõi dữ liệu dành riêng cho người dùng. Ví dụ về dữ liệu đó là các mặt hàng mà người dùng của bạn đã thêm vào giỏ hàng.
Nếu không có phiên, bạn phải duy trì một kho lưu trữ dữ liệu riêng cho từng người dùng trong ứng dụng của mình. Điều này sẽ không hiệu quả và tăng độ phức tạp của ứng dụng.
Express.js Đơn giản hóa Phiên, Định tuyến và hơn thế nữa
Express.js là khung web Node.js phổ biến nhất hiện đang được sử dụng. Nó cung cấp nhiều công cụ và thư viện để tạo các ứng dụng phụ trợ và thư viện phiên nhanh chỉ là một trong số đó.
Nếu bạn muốn sử dụng Node.js để phát triển web phụ trợ, hãy xem Express.