- Home
- Node JS
- Authentication trong nodejs là gì ? Tại sao quan trọng ?
1 năm ago 11 tháng ago
Node JS
win
Authentication trong nodejs là gì ? Tại sao quan trọng ?
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
by HocWeb VN 1 năm ago11 tháng ago
1061
- 1.6Kshares
1.6k shares, 1061 points
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.
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:
- JavaScript
- Node.js
- Express [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:
- body-parser[parse các request tới server]
- express[làm cho ứng dụng chạy]
- nodemon[restart khi có thay đổi xảy ra]
- mongoose[mô hình hóa object data để đơn giản hóa các tương tác với MongoDB]
- bcrypt[hashing và salting passwords]
- express session[xử lý sessions]
- connect-mongo[lưu trữ session trong MongoDB]
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].
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 Mongoose
- Cài đặt mongodb
- Thiết lậpmongodb
- Đả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.
- Tạo một schema theotài liệu hướng dẫntrong một thư mục riêng
- 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:
var mongoose = require['mongoose']; var UserSchema = new mongoose.Schema[{ email: { type: String, unique: true, required: true, trim: true }, username: { type: String, unique: true, required: true, trim: true }, password: { type: String, required: true, }, passwordConf: { type: String, required: true, } }]; var User = mongoose.model['User', UserSchema]; module.exports = User;Chèn dữ liệu vào MongoDB
- Thêm middlewarebody-parserđể parse body của các request đến server
- Tạo POST route cho việc gửi dữ liệu tới server
- Lưu trữ các giá trị được điền vào form và lưu trữ vào db với schema. [ gồm những thuộc tính để Authentication]
Sẽ trông như thế này
if [req.body.email && req.body.username && req.body.password && req.body.passwordConf] { var userData = { email: req.body.email, username: req.body.username, password: req.body.password, passwordConf: req.body.passwordConf, } //use schema.create to insert data into the db User.create[userData, function [err, user] { if [err] { return next[err] } else { return res.redirect['/profile']; } }]; }- Sử dụngmongo shellđể kiểm tra xem dữ liệu đã được lưu vào databse hay chưa? [nó nên có dữ liệu khi sử dụngdb.users.find[]]
Hashing và salting
Hàm mã hóa hash nhận một phần thông tin và trả lại một chuỗi được mã hóa. Các giá trị đã được mã hóa không dễ bị giải mã và đó là lý do tại sao chúng được sử dụng cho password. Để có thể Authentication một cách dễ dàng
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:
- cài đặtbcryptpackage
- thêm prehook tới mongoose schema của bạn, nó sẽ như thế này:
- 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.
Thiết lập Sessions
- Thêmexpress sessionspackage
- Thêm session middleware trong ứng dụng của bạn. Nó sẽ như thế này:
- Sử dụng MongoDB để lưu trữ userId trongreq.session.userId
- Thiết lập login route tương tự cách bạn thiết lập register route [trong login form bạn chỉ có 2 trường username và password]
- Xác thực[Authentication] thông tin người dùng nhập với dữ liệu trong database sẽ như thấy:
Hãy dành thời gian để hiểu đoạn code này, vì nó là chức năng chính trong toàn bộ quá trình Authentication theo ý kiến của tôi!
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 HTML
- Tạo một logout route để hủy session id và điều hướng đến trang chủ. Nó sẽ như thế này:
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.
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.
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:
- 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 HTTPS
- Nhớ rằng đây [với sessions và cookies] chỉ là một trong nhiều cách để xác thực
- Có thể Authentication dựa trên token với OAuth hay JSON Web Tokens
- Hay vớipassport middleware
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.
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.
Bài viết này mình sưu tầm và tổng hợp từ nhiều nguồn trên Internet.
Nếu có gì không hiểu thì inbox messenger bên dưới mình hỗ trợ thêm nhé.
Post Pagination
- Previous PostPrevious
- Next PostNext
authentication, express
Like it? Share with your friends!
1061
- 1.6Kshares
1.6k shares, 1061 points
What's Your Reaction?
hate
1665
hateconfused
333
confusedfail
2664
failfun
2331
fungeeky
1998
geekylove
999
lovelol
1332
lolomg
333
omgwin
2667
win- Previous Post
Từng bước tạo ứng dụng React với Firebase
by HocWeb VN
- Next Post
11 React Hooks hữu ích không thể bỏ qua
by HocWeb VN
Có thể bạn sẽ thích:
Popular win
1062
Node JSapi, express, nodejs, restful
Từng bước tạo RESTful API với NodeJS , Express, MySQL
by Vu Duc Phuong
confused lol
1086
Node JSchat, express
NodeJS là gì? ExpressJS là gì ? Từng bước tạo ứng dụng chat trên NodeJS
by HocWeb VN
1047
Node JSdebug, express
Logs NodeJS là gì ? Và tại sao nên dùng ?
by HocWeb VN
Nhiều hơn: Node JS
love fail
1093
Node JSnodejs, tự học nodejs
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 3 Nền tảng Node.js
by Vu Duc Phuong
1099
Node JSnodejs, tự học nodejs
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 2 Install Node.js, npm, VS Code
by Vu Duc Phuong
Trending fail
1081
Node JSnodejs, tự học nodejs
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 1 Tổng quan
by Vu Duc Phuong
hate
1071
Node JSiot, mqtt, nodejs, raspberry pi
Tạo ứng dụng Node.js IOT trên Raspberry Pi dùng giao thức MQTT
by Vu Duc Phuong
Trending
1047
Node JSnodejs
Các cách cài đặt NodeJS với Ubuntu 20.04
by Vu Duc Phuong
Popular win
1062
Node JSapi, express, nodejs, restful
Từng bước tạo RESTful API với NodeJS , Express, MySQL
by Vu Duc Phuong
Nhiều bài hơn nữa:
love fail
1093
Node JSnodejs, tự học nodejs
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 3 Nền tảng Node.js
by Vu Duc Phuong
1099
Node JSnodejs, tự học nodejs
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 2 Install Node.js, npm, VS Code
by Vu Duc Phuong
Trending fail
1081
Node JSnodejs, tự học nodejs
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 1 Tổng quan
by Vu Duc Phuong
hate
1071
Node JSiot, mqtt, nodejs, raspberry pi
Tạo ứng dụng Node.js IOT trên Raspberry Pi dùng giao thức MQTT
by Vu Duc Phuong
Trending
1047
Node JSnodejs
Các cách cài đặt NodeJS với Ubuntu 20.04
by Vu Duc Phuong
Popular win
1062
Node JSapi, express, nodejs, restful
Từng bước tạo RESTful API với NodeJS , Express, MySQL
by Vu Duc Phuong
Bài viết này mình sưu tầm và tổng hợp từ nhiều nguồn trên Internet.
Nếu có gì không hiểu thì inbox messenger bên dưới mình hỗ trợ thêm nhé.
Hot
1
Hướng dẫn dùng JavaScript để lấy dữ liệu fetch API từ ngân hàng UK
2
Các cách cài đặt NodeJS với Ubuntu 20.04
3
Hướng dẫn Deploy website NodeJS lên VPS
4
Từng bước tạo RESTful API với NodeJS , Express, MySQL
5
Tự học Node.js cơ bản để đi phỏng vấn [13 bài] 1 Tổng quan