/ / Xác thực lược đồ trong Node.js với Joi

Xác thực lược đồ trong Node.js với Joi

Việc chấp nhận dữ liệu chưa được kiểm tra và chưa được xác thực vào ứng dụng web có thể gây ra các lỗ hổng bảo mật và các sự cố không lường trước được có thể phát sinh từ dữ liệu không hợp lệ.


Các ORM của Node.js, chẳng hạn như Sequelize và TypeORM, cho phép bạn đặt các quy tắc xác thực ngay lập tức ở cấp ứng dụng. Trong quá trình phát triển API, dữ liệu đến từ các yêu cầu HTTP đến các điểm cuối cụ thể. Điều này xảy ra ở cấp độ yêu cầu; do đó, xác thực mặc định do ORM cung cấp không áp dụng cho chúng.

Joi là một trình xác thực dữ liệu và mô tả lược đồ cho JavaScript. Tại đây, bạn sẽ tìm hiểu cách sử dụng thư viện xác thực Joi để xác thực dữ liệu ở cấp độ yêu cầu.


Thiết lập dự án demo

Để chứng minh cách Joi xác thực dữ liệu, bạn sẽ xây dựng một ứng dụng demo đơn giản bắt chước một ứng dụng thực tế.

Ảnh chụp màn hình trang chủ Joi

Đầu tiên, tạo một thư mục dự án và di chuyển vào đó bằng cách chạy lệnh sau:

 mkdir demoapp && cd demoapp

Tiếp theo, khởi tạo npm trong thư mục dự án của bạn bằng cách chạy:

 npm init -y

Tiếp theo, bạn sẽ cần cài đặt một số phụ thuộc. Các phụ thuộc cần thiết cho hướng dẫn này bao gồm:

  • Thể hiện: Express là một khung công tác Node.js cung cấp một bộ tính năng mạnh mẽ cho các ứng dụng web và di động. Express giúp việc xây dựng các ứng dụng phụ trợ với Node.js trở nên dễ dàng hơn.
  • Joi: Joi là thư viện xác thực dữ liệu cho Node.js.

Cài đặt các phụ thuộc với trình quản lý gói nút bằng cách chạy lệnh bên dưới:

 npm install express joi

Tiếp theo, tạo một index.js tệp trong thư mục gốc của bạn và thêm khối mã sau vào đó:

 const express = require("express");
const router = require("./routes");
const port = 3000;

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(router);

app.listen(port, () => {
  console.log("app listening on port 3000!");
});

Khối mã ở trên thiết lập một máy chủ Express đơn giản. Nó định cấu hình phần mềm trung gian để phân tích dữ liệu yêu cầu đến và xử lý các yêu cầu đến, đồng thời khởi động máy chủ để lắng nghe các yêu cầu đến trên cổng 3000.

Định tuyến và xử lý yêu cầu

Để đơn giản, bạn sẽ tạo một phần mềm trung gian xử lý yêu cầu trả về mã trạng thái, cùng với nội dung yêu cầu, như một phản hồi cho mọi yêu cầu cố gắng gửi dữ liệu đến ứng dụng của bạn.

Tạo một xử lý.js tệp trong thư mục gốc của dự án của bạn và thêm khối mã bên dưới:

 const demoHandler = (req, res, next) => {
  res.send({
    code: 201,
    data: req.body,
  });
  next();
};

module.exports = demoHandler;

Tiếp theo, tạo một bộ định tuyến.js tệp trong thư mục gốc của dự án và thêm khối mã bên dưới vào tệp của bạn:

 const express = require("express");
const demoHandler = require("./handler");
const router = express.Router();

router.post("/signup", demoHandler);

module.exports = router;

Tạo lược đồ Joi

Lược đồ Joi biểu thị cấu trúc và quy tắc xác thực dự kiến ​​của một đối tượng dữ liệu cụ thể.

Để tạo lược đồ Joi, bạn có thể sử dụng Joi.object() phương pháp và xâu chuỗi các quy tắc xác thực khác nhau do Joi đưa ra để xác định cấu trúc và các yêu cầu xác thực cho dữ liệu của bạn.

Ví dụ:

 const exampleSchema = Joi.object({
  name: Joi.string().min(3).required(),
});

Ví dụ trên mô tả một lược đồ Joi đơn giản với một tên tài sản. Các tên tài sản có giá trị là Joi.string().min(3).required(). Điều này có nghĩa là tên giá trị phải là một chuỗi, có độ dài tối thiểu là 3 ký tự và bắt buộc phải có.

Sử dụng Joi, bạn có thể xâu chuỗi các phương thức khác nhau để thêm nhiều ràng buộc xác thực hơn cho từng trường được xác định trong lược đồ của mình.

Đây là một ví dụ với nhiều trường hơn và các ràng buộc xác thực:

 const userSchema = Joi.object({
  email: Joi.string().email().required(),

  password: Joi.string().min(6).required(),

  age: Joi.number().min(18).optional(),

  employed: Joi.boolean().optional(),

  phone: Joi.string()
    .regex(/^\d{3}-\d{3}-\d{4}$/)
    .required(),

  address: Joi.object({
    street: Joi.string().min(3).required(),
    city: Joi.string().min(3).required(),
    state: Joi.string().min(3).required(),
    zip: Joi.number().min(3).required(),
  }).required(),

 hobbies: Joi.array().items(Joi.string()).required(),

}).options({ abortEarly: false });

Các người dùngSchema xác định các ràng buộc sau cho từng thuộc tính:

  • e-mail: Phải là một chuỗi email hợp lệ.
  • mật khẩu: Phải là chuỗi có tối thiểu 6 ký tự.
  • tuổi: Một số tùy chọn có giá trị nhỏ nhất là 18.
  • có việc làm: Một boolean tùy chọn.
  • điện thoại: Một chuỗi bắt buộc khớp với biểu thức chính quy đã chỉ định (/^d{3}-d{3}-d{4}$/).
  • Địa chỉ: Một đối tượng đại diện cho địa chỉ của người dùng với các thuộc tính phụ sau đây.
    • đường phố: Là chuỗi bắt buộc có độ dài tối thiểu 3 ký tự.
    • thành phố: Là chuỗi bắt buộc có độ dài tối thiểu 3 ký tự.
    • tình trạng: Là chuỗi bắt buộc có độ dài tối thiểu 3 ký tự.
    • khóa kéo: Một số bắt buộc có giá trị nhỏ nhất là 3.
  • sở thích: Một mảng chuỗi bắt buộc.

Bên cạnh những hạn chế, người dùngSchema đặt hủy bỏ sớm tùy chọn để SAI. Theo mặc định, Joi dừng thực thi chương trình ngay khi gặp lỗi đầu tiên và in lỗi ra bàn điều khiển. Tuy nhiên, đặt tùy chọn này thành SAI đảm bảo rằng Joi kiểm tra toàn bộ lược đồ và in tất cả các lỗi gặp phải ra bàn điều khiển.

Xác thực dữ liệu với Joi

Tạo một xác thực.js tập tin và thêm người dùngSchema mã cho nó.

Như vậy:

 
const Joi = require("joi");

const userSchema = Joi.object({
}).options({ abortEarly: false });

module.exports = userSchema;

Sau đó, tạo một phần mềm trung gian chặn tải trọng yêu cầu và xác minh chúng dựa trên lược đồ được cung cấp bằng cách thêm mã sau vào bên dưới người dùngSchema mã số.

 const validationMiddleware = (schema) => {
  return (req, res, next) => {
    const { error } = schema.validate(req.body);

    if (error) {
      
      console.log(error.message);

      res.status(400).json({ errors: error.details });
    } else {
      
      next();
    }
  };
};

Khi một yêu cầu được thực hiện, phần mềm trung gian sẽ gọi xác thực phương pháp của lược đồ để xác thực nội dung yêu cầu. Nếu xảy ra bất kỳ lỗi xác thực nào, phần mềm trung gian sẽ gửi một 400 yêu cầu sai phản hồi với các thông báo lỗi được trích xuất từ ​​chi tiết lỗi xác thực.

Mặt khác, nếu quá trình xác thực trôi qua mà không có lỗi, phần mềm trung gian sẽ gọi Kế tiếp() chức năng.

Cuối cùng, xuất khẩu xác thựcMiddlewarengười dùngSchema.

 module.exports = {
  userSchema,
  validationMiddleware,
};

Kiểm tra các ràng buộc xác thực

Nhập khẩu xác thựcMiddlewarengười dùngSchema vào của bạn bộ định tuyến.js tệp và thiết lập phần mềm trung gian như sau:

 const { validationMiddleware, userSchema } = require("./validation");

router.post("/signup", validationMiddleware(userSchema), demoHandler);

Bắt đầu ứng dụng của bạn bằng cách chạy lệnh bên dưới:

 node index.js

Sau đó, thực hiện một yêu cầu HTTP POST tới localhost:3000/đăng ký sử dụng dữ liệu thử nghiệm bên dưới. Bạn có thể đạt được điều này bằng cách sử dụng cURL hoặc bất kỳ ứng dụng API nào khác.

 {
  "email": "user@example",
  "password": "pass",
  "age": 15,
  "employed": true,
  "hobbies": ["reading", "running"],
  "phone": "123-456-789",
  "address": {
    "street": "123",
    "city": "Example City",
    "state": "Example State",
    "zip": 12345
  }
}

Yêu cầu này sẽ không thành công và trả về một đối tượng lỗi vì tải trọng chứa nhiều trường không hợp lệ, chẳng hạn như email, mật khẩu, tuổi và điện thoại. Sử dụng đối tượng lỗi được cung cấp, bạn có thể xử lý các lỗi một cách thích hợp.

Đơn giản hóa xác thực dữ liệu với Joi

Ở đây bạn đã trình bày hầu hết các khái niệm cơ bản về xác thực dữ liệu bằng Joi. Tuy nhiên, bạn có thể đề cập đến các kỹ thuật và ràng buộc nâng cao hơn trong tài liệu Joi.

Joi đơn giản hóa tác vụ xác thực dữ liệu trong JavaScript, cung cấp giải pháp trực quan giúp cải thiện đáng kể độ tin cậy và tính toàn vẹn của dữ liệu được lưu trữ trong ứng dụng của bạn.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *