Là gì

Express Session Là Gì – Hỏi Về Session Trong Node

authenticationchatchatbotcomponentsdebugdevdeveloperdevopdeppressfirebaseFlutterframeworkgraphQLjadejavascriptjestmicrofrontendmodulenodejspuppeteerreactreactjsredisSSRtestunittestview enginevscodevue

Xác thực (authentication) là một vấn đề quan trọng khi tạo các ứng dựng web động. Bài viết này sẽ làm rõ mọi thứ và cung cấp một hướng dẫn cơ bản

Authentication(Xác thực) là gì?

Xác thực (authentication) là xác định danh tính người dùng, cung cấp các quyền truy cập và nội dung khác nhau phụ thuộc vào id của họ. Trong hầu hết các trường hợp ứng dụng cung cấp một login form với những thông tin nhất định để xác minh người dùng.

Đang xem: Express session là gì

Cần phải hiểu các khái niệm:

Xác thực (authentication) là gì?Phân quyền (authorization) là gì?Session là gi?Cookie là gì?

Những thứ cần thiết

Môi trường

Trong ví dụ này tôi sẽ sử dụng:

JavaScriptNode.jsExpress (JS framework)MongoDB (Database)Yarn (quản lý các package)Visual Studio Code

Về UI tôi sử dụngtemplate từ w3layouts.

Các dependency

Các package sẽ sử dụng:

Cấu trúc

Hướng dẫn này sẽ chia làm các phần:

Đăng ký người dùng (thiết lập các route và database để Authentication)Sessions và Cookies (kết nối chúng tới các login route)Tạo custom middleware (cải thiện hiệu năng)

Đăng ký người dùng

Tôi sẽ bắt đầu với với một thiết lập express cơ bản, nó chỉ đơn giản là một web server và phục vụ các tệp tin tĩnh (static file). (xem Github commit này).

READ  Kiểm Tra Là Gì Giám Sát Là Gì, Khái Niệm Về Giám Sát Theo Quy Định Pháp Luật

Nếu bạn chưa biết về Express tham khảo tại đây: Express JS là gì ? Từng bước tạo ứng dụng chat trên NodeJS

Kết nối với MongoDB

Cài đặt MongooseCài đặt mongodbĐảm bảo mongodb đang chạy cùng với server localhost

Tạo một schema

MongoDB là một document database, nó lưu trữ JSON như các object. Model/schema mô tả cái mà các đối tượng này chứa.

Schema lên mô tả các trường chúng ta có trong form và chỉ định dữ liệu nó mong đợi

Nó sẽ trông như thế này:

Salt là các dữ liệu ngẫu nhiên sẽ được mã hóa cùng với password mà người dùng nhập. (các chuỗi giống nhau khi mã hóa sẽ có kết quả giống nhau, vì vậy chúng ta cần thêm các dữ liệu ngẫu nhiên salt).

Trong ví dụ này chúng ta sẽ sử dụngbcrypt.

Tiếp theo:

thêm prehook tới mongoose schema của bạn, nó sẽ như thế này:

//hashing a password before saving it to the databaseUserSchema.pre(“save”, function (next) { var user = this; bcrypt.hash(user.password, 10, function (err, hash){ if (err) { return next(err); } user.password = hash; next(); })});kiểm tra với mongod xem password đã được mã hóa hay chưa?So sánh vớicommitnày nếu cần.

Đến đây, bạn đã hoàn thành 50% toàn bộ ứng dụng và là phần khó nhất! Hãy tiếp tục!

Sessions và Cookies

HTTP là một giao thức stateless, điều đó có nghĩa là web server không theo dõi ai đang nghé thăm một trang web. Việc hiển thị nội dung cụ thể cho người dùng đã đăng nhập yêu cần phải theo dõi điều này. Vì thế sessions với một session ID đã được tạo ra. Cookies là các cặp key/value được quản lý bởi trình duyệt. Tương ứng với sessions của server.

READ  Tụ Dầu Là Gì - Hướng Dẫn Phân Biệt Tụ Ngâm & Tụ Đề

Thiết lập Sessions

Thêm session middleware trong ứng dụng của bạn. Nó sẽ như thế này:

Bây giờ ứng dụng xác thực của bạn đã xong Chúc mừng!

Cải tiến ứng dụng

Điều chỉnh bố cục của bạn cho phù hợp (ẩn form register và cung cấp nút logout khi người dùng đã đăng nhập)Tạo một middleware để ID của người dùng có sẵn trong HTMLTạo một logout route để hủy session id và điều hướng đến trang chủ. Nó sẽ như thế này:

// GET /logoutrouter.get(“/logout”, function(req, res, next) { if (req.session) { // delete session object req.session.destroy(function(err) { if(err) { return next(err); } else { return res.redirect(“/”); } }); }});Có nhiều thứ để làm thêm nhưng logout và hủy session là những thứ quan trọng cho mỗi hệ thống xác thực! Đó là lý do tại sao tôi thêm chúng ở đây.

Xem thêm: Người Ấy Là Em Hay Là Ai 11 : Em Trai Đả Nữ Ngô Thanh Vân Bị Nữ Chính Từ Chối

Tạo custom middleware

Middleware chạy sau khi nhận một request, và trước khi một response được gửi trở lại. Trong ví dụ này body-parser package được sử dụng như middleware. Nó chuyển đổi các request đến thành định dạng mà các chương trình có thể dễ dàng sử dụng.

Các hàm Middleware có thể nối chuỗi phù hợp với chu trình request/response của ứng dụng. Khi viết custom middleware,next()luôn được gọi tại cuối của middleware để di chuyển đến middleware tiếp theo trong chu trình.

Ví dụ: Tạo một middleware yêu cầu login cho một số trang nhất định.

READ  Thịt Bò A5 Là Gì ? Thịt Bò Wagyu A5 Có Gì Đặc Biệt

function requiresLogin(req, res, next) { if (req.session && req.session.userId) { return next(); } else { var err = new Error(“You must be logged in to view this page.”); err.status = 401; return next(err); }}router.get(“/profile”, mid.requiresLogin, function(req, res, next) { //…});

Lưu ý về khả năng mở rộng với sessions

Hiện tại sessions được lưu trữ trong RAM. Để lưu trữ với dung lượng lớn hơn chúng ta có thể kết nối session store với MongoDB. Tôi sẽ sử dụngconnect-mongopackage.

Viết code như thế này:

//use sessions for tracking loginsapp.use(session({ secret: “work hard”, resave: true, saveUninitialized: false, store: new MongoStore({ mongooseConnection: db })}));Khi kiểm tra với mongo shell bạn sẽ thấy một collection mới là “sessions” được tạo. Khi login hay logout dữ liệu của collection sẽ thay đổi tương ứng.

Lưu ý

Luôn luôn đảm bảo thông tin xác thực được mã hóa khi truyền từ trình duyệt tới server và ngược lại.Sử dụng HTTPSNhớ rằng đây (với sessions và cookies) chỉ là một trong nhiều cách để xác thựcCó thể Authentication dựa trên token với OAuth hay JSON Web Tokens

*

Xem source code trênGithub.

Kết luận

Đây là cách dễ dàng nhất để triển khai một hệ thống xác thực với Node.js và MongoDB.

Xem thêm: What Is Network Key Là Gì ? Định Nghĩa Và Giải Thích Ý Nghĩa

Nếu bạn theo dõi Github repo , bạn sẽ thấy liên tục refactor source code để fix các lỗi và cải thiện nó. Vì thế tôi gợi ý bạn nên xem phiên bản hoàn chỉnh.

Trả lời

Back to top button