Cách dùng các phiên Node.js để duy trì dữ liệu

Theo dõi các đăng nhập người dùng bằng phương pháp tiếp cận an toàn hơn lưu trữ cookie một mình bằng Node.js. Dưới đây là cách dùng phiên Node.js để duy trì dữ liệu.

Lập trình Node.js

Khi ứng dụng web cần ghi nhớ người dùng, về cơ bản, nó dùng cả một trong hai cơ chế: cookie và session. Cookie là một vùng lưu trữ nhỏ trong trình duyệt. Tại đây, bạn có thể lưu dữ liệu liên quan tới người dùng chẳng hạn như tùy chọn tìm kiếm, còn session cho phép bạn lưu trữ thông tin nhạy cảm trên server.

Giờ hãy cùng Quantrimang.com khám phá cách thiết lập các phiên (session) trong một server Express do Node.js cung cấp.

Chuẩn bị:

Để làm theo hướng dẫn này, bạn cần cài cả Node.js và npm. Bất kỳ phiên bản mới của Node.js đều đi kèm với npm, một trình quản lý gói để cài đặt những phần phụ thuộc.

Bạn sẽ dùng npm để cài đặt Express và express-session. Chúng là những công cụ bạn sẽ dùng để tạo server web và session.

Session trong Node.js là gì?

Cookie là một file nhỏ mà trình duyệt dùng để lưu trữ dữ liệu. Bạn có thể dùng cookie để lưu dữ liệu không nhạy cảm như cấu hình tìm kiếm.

Bạn không nên lưu dữ liệu nhạy cảm như tên người dùng và mật khẩu trong cookie. Khi trình duyệt gửi cookie qua HTTP, chúng rất dễ bị tin tặc tấn công. Chúng cũng được lưu dưới dạng văn bản thuần túy trên máy tính, vì thế, hacker có thể kiểm tra 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 client, bạn nên lưu nó trên server. Điều này giúp “cách ly” nó với thế giới bên ngoài.

Session cho phép bạn lưu dữ liệu nhạy cảm trên ứng dụng cần xác định người dùng, chẳng hạn như tên, mật khẩu và email. Chúng an toàn hơn bởi nằm trên server, không phải phía client.

Bất kỳ lúc nào bạn có dữ liệu muốn duy trì trên truy vấn, hãy lưu nó trên server bằng session. Bạn sẽ học cách để tạo một phiên ở phần sau.

Tạo một session trong server Express

Express là một framework web phổ biến cho Node.js. Nó cho phép bạn thiết lập một ứng dụng web server mà lắng nghe các truy vấn client ở số cổng được chọn. Bạn có thể tạo các tuyến API, áp dụng phần mềm trung gian, thậm chí kết nối app với database, tất cả nhờ API do framework cung cấp.

1. Tạo dự án Node.js

Tạo một thư mục mới cho dự án của bạn, sau đó mở công cụ dòng lệnh và cd trong thư mục đó.

Tiếp theo, chạy dòng lệnh để khởi tạo dự án Node.js:

npm init -y

Điều này tạo một file package.json trong thư mục gốc của dự án bằng thiết lập mặc định. File package.json sẽ chạy các tập lệnh npm.

2. Cài đặt Express và express-session

Bạn sẽ dùng Express để tạo ứng dụng web server. Và express-session để tạo các phiên trên ứng dụng server đó.

Ở terminal, chạy lệnh sau để cài đặt cả hai phần 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 server.

3. Tạo session trong App

Tạo một file tên App.js trong thư mục gốc của dự án và nhập các phần phụ thuộc:

const express = require('express')
const session = require('express-session')
app = express()

Tiếp theo, đăng ký session middleware. Truyền vào một đối tượng với thuộc tính secret (để ký cookie sessionID) và cookie.

app.use(
  session({
    secret: "some secret",
    cookie: { maxAge: 30000 },
    saveUninitialized: false,
  })
);

Tại đây, bạn đặt thời lượng session cao nhất là 30 giây (30000 mili giây). Đặt saveUnitialized sang false là cần thiết nếu bạn có một hệ thống đăng nhập. Nếu không làm được việc này, server của bạn sẽ tạo một sessionID mới mỗi lần người dùng gửi truy vấn.

Tiếp theo, tạo một tuyến đăng nhập để thay đổi phiên. Khi người dùng truy cập lộ trình này, bạn muốn client gửi tên người dùng và mật khẩu ở phần nội dung truy vấn. Đầu tiên, truy cập những giá trị này, rồi kiểm tra nếu chúng đã tồn tại hay chưa cùng tính xác thực của người dùng.

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 tiến hành một kiểm tra mẫu. Kiểm tra này đảm bảo 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 liệu người dùng đã được xác thực hay chưa. Nếu chưa, gửi lại session cho client. Nếu không, đặt thuộc tính đã xác thực thành true và lưu tên người dùng vào session. Sau đó, gửi nó lại cho client.

Với code trên, server sẽ nhớ từng người dùng đã gửi truy vấn tới server. Điều này là do chúng đã được xác thực và có tên người dùng & mật khẩu độc đáo được lưu trong session này.

Khởi động server bằng cách thêm code sau ở phía dưới của App.js:

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

Để kiểm tra route này, dùng một client API để gửi truy vấp tới tuyến đăng nhập bạn đã tạo. Đảm bảo gửi tên người dùng và mật khẩu ở phần nội dung của truy vấn. Đây là cách hiển thị truy vấn API nếu dùng Rest Client:

POST http://localhost:3000/login HTTP/1.1
Content-Type: "application/json"
{ username: "Kingsley", password: "123"}

Nếu mọi thứ đều chạy ổn, bạn sẽ có:

{
  "cookie": {
    "originalMaxAge": 30000, 
    "httpOnly": true, 
    "path": "/" 
  },
  "authenticated": true, 
  "user": { 
    "username": "Kingsley", 
    "password": "123" 
  }
}

Với code này, hai điều đã xảy ra. Đầu tiên, bạn đã xác thực trên server. Thứ hai, session giờ có thông tin đăng nhập, vì thế, server đã biết bạn là ai. Bất kỳ lúc nào bạn gửi truy vấn mới, nó sẽ ghi nhớ bạn cho tới khi phiên đó hết hạn. Server sẽ loại bỏ nó sau đó.

Session là một phần quan trọng của các ứng dụng Node.js vì chúng cho phép bạn duy trì trạng thái tương tác trên nhiều truy vấn và phản hồi. Session đặc biệt quan trọng đối với ứng dụng bạn cần đăng nhập.

Thứ Sáu, 14/04/2023 07:54
51 👨 423
0 Bình luận
Sắp xếp theo