Tóm tắt: Kết nối ứng dụng với MongoDB database và bắt đầu thêm sản phẩm vào database.Trong folder Config, ta tạo 1 file là database.js, chủ yếu dùng để chứa hàm connectDatabase.Trở lại f
LET’S START WITH SHOPIT BACKEND
Basic Project
Tóm tắt: Phần chính trong video này, tác giả muốn đề cập về phần set up môi trường để code với các gói package bắt buộc ở các folder 1 và 2 như Express, Mongul hay Mongo’s Cũng như bắt tay vô xây dựng những bước cơ bản ban đầu và chạy thử sever trong video này. Đầu tiên, ta tạo ra 2 folder lần lượt là backend và frontend.
Ta mở phần terminal trong visual code ra.
Tại đây, trên root folder ta gõ lệnh “npm init” và nhấn enter để khởi tạo ứng dụng cho phần backend.
Sau khi nhấn enter ở bước trên, lập tức các thông tin liên quan về project này sẽ hiện lên và ta cần phải điền đầy đủ các thông tin như: package name, version, description, entry point, test command, git respository,…
Sau khi hoàn tất các thông tin thì visual code sẽ tự động sinh ra 1 file json như bên dưới đây chứa các nội dung mà ta vừa điền.
Ta trở xuống thanh terminal để install một vài package trước khi đến với các bước tiếp theo sau nhé!
Trước tiên, ta install express và dotenv để đọc được các biến trong môi trường.
Và cài đặt cả Mongoose cho phần MongoDB.
Ta dùng lệnh: npm I express dotenv mongoose và nhấn enter.
Sau khi cài đặt xong thì visual code sẽ sinh ra file package-lock.json như bên dưới:
Trong folder backend, ta tạo một folder tên là config (cấu hình), và trong folder config, ta tạo 1 file là config.env
Trong file này ta định nghĩa các cho các biến với PORT bằng 4000 và NODE_ENV = DEVELOPMENT.
Trong folder backend, ta tạo lần lượt 2 file là app.js và sever.js app.js sever.js
Sau đó, ta gõ lên terminal bằng lệnh node backend/sever.js để start thử sever Được kết quả như bên dưới đây.
Installing_Setting Up Nodemon
Tóm tắt: Trong video này, tác giả chủ yếu tiếp tục hướng dẫn cài đặt và set up phần Nodemon trước khi sang các bước kế tiếp. Đầu tiên,ta gõ lên thanh terminal lệnh: npm i nodemon –save-dev để cài đặt.
Sau khi cài đặt thành công thì trong file package.json ta sẽ thấy tự động có thêm phần devDependencies.
Cũng tại file package.json, ta set up lại phần scripts như sau:
Sau khi set up xong, ta chạy thử với lệnh: npm run dev hoặc nmp run prod.
Creating First Route
Tóm tắt: Tạo 2 folder lần lượt là controller và routes.
Trong phần backend, ta tạo 1 folder là controller, trong controller ta tạo file productController.js File này có chức năng sẽ xử lí các product có liên quan tới logic hoặc chứa các hàm controller Cụ thể bên dưới này, ta xây dựng 1 hàm có tên là “getProducts”.
Tạo 1 folder là route trong phần backend để xử lí cho tất cả các route, trong route ta tạo file product.js.
Setting Up Postman Environment
Tóm tắt: Tập trung cài đặt môi trường Postman.
- Download Postman về máy: https://www.postman.com/downloads/ -> Đăng ký tài khoản Postman -> Đăng nhập thành công vào Postman.
Tại góc bên tay phải, click vào biểu tượng đánh số như hình dưới, tại đây ta 1 click chọn button “Add” để thêm môi trường mới vào.
Ta đặt tên cho môi trường là ShopIT, Variable là DOMAIN và INITIAL VALUE là http://localhost:4000.
Tạo một (1) Collection mới đặt tên là (2) “Shop IT”, -> tạo folder “Product”.
Ta sẽ save lại route trong folder này bằng cách gõ lệnh (3)
{{DOMAIN}}/api/v1/products Click button (4) Send Và cuối cùng nếu thành công sẽ cho ra kết quả như (5) Sau cùng, ta save lại và đặt tên route là “Get All Products”.
Như vậy là ta đã hoàn thành việc set up xong cho Postman.
Connecting To MongoDB
Tóm tắt: Kết nối ứng dụng với MongoDB database và bắt đầu thêm sản phẩm vào database.
Trong folder Config, ta tạo 1 file là database.js, chủ yếu dùng để chứa hàm connectDatabase.
Trở lại file server.js, tại đây import vào và gọi hàm ra.
Sau khi, save lại ta nhận thấy ở terminal sẽ xuất hiện hai dòng thông báo như bên dưới đây Nghĩa là database đã được kết nối thành công với localhost của ta.
ADDING PRODUCTS RESOURCE
Creating Product Model
Tóm tắt: Tiến hành tạo product model, sau đó thêm product vào database ở video kết tiếp. Đầu tiên, trong folder backend, tạo 1 folder mới tên là models Sau đó, tạo 1 file là product.js trong folder models Trong file này, ta set up một product model bao gồm tên sản phẩm, giá thành, mô tả, tỷ giá,
Vậy là ta đã set up thành công product model này và trong video tiếp theo ta sẽ thêm route đầu tiên để tạo ra một product mới.
Admin - Create _ Save Product
Tóm tắt: Tạo route đầu tiên để tạo ra product mới và save product đó lên database Đầu tiên, tại thư mục controllers -> file productController.js Đi đến folder routes -> product.js
Trong folder backend, ta tạo 1 folder mới là data, tại đây ta tạo 1 file product.js
File này sẽ chứa data của một vài product.
Chẳng hạn với sản phẩm “Tony Buoi Sang” như hình dưới thì sản phẩm có thể có 2 hình ảnh.
Ta mở postman lên, chỉ admin mới có thể thêm product nhưng ngay lúc này, ta không có bất kì authentication nào hết vì vậy ai cũng có thể tạo được product hết Điều này là hoàn toàn bình thường vì ta vẫn chưa có bất kì authentication nào bây giờ.
Ta select “POST” (1) -> gõ DOMAIN (2) vào -> coppy thông tin của một product (3) dán vào -> click “Send” (4).
Creating Data Seeder
Tóm tắt: Trong video này, ta sẽ create data seeder sẽ giúp ta seed data (giúp ta push các product) Ta sẽ tạo 1 single file để push tất cả các product vào database chỉ trong một command.
Trong folder backend, tạo 1 folder tên là utils Tại đây tạo 1 file seeder.js Đồng thời, ta thêm một scrip mới trong file package.json
Sau đó, ta gõ lệnh: npm run seeder lên terminal, kết quả trả về như sau.
Ta qua kiểm tra bên MongoDB Compass, thì toàn bộ các product đã được load lên.
Display all products
Tóm tắt: Ta sẽ display toàn bộ product trong database trong productController.js
Ta sang postman để kiểm tra thử, click chọn “send” (1) Thì kết quả trả về là toàn bộ cá product Ở (3) thể hiện thông số như (3) success là true và tổng số product là 2.
Get Single Product
Tóm tắt: Trong video này, ta sẽ get một special product detail với sự giúp đỡ của ID ( ID của product mà Mongoose đã assigned cho nó).
Nếu như có ID mà ta cần tìm thì kết quả sẽ trả về success: true và thông tin product Nếu như không có thì về success: false kèm message “Product not found”.
Trở lại postman, get request: Nếu có id ta cần tìm.
Nếu không có id cần tìm:
Admin _ Update Product
Tóm tắt: Trong video này, ta sẽ update các product (các thông tin của product). Đồng thời, ta cũng thêm bên routes -> product.js
Ta thấy hiện tại, product “Tony Buoi Sang” số lượng đang còn 10.
Ta sẽ update stock lên thành 50 như sau:
Admin _ Delete Product
Tóm tắt: Trong video này, ta sẽ xử lí việc xóa các product. Controller -> productController.js Đồng thời, ta cũng thêm bên routes -> product.js
Trở sang bên postman, ta sẽ xóa product có id như hình (2) Và thông báo xuất hiện là đã xóa thành công!
Bây giờ ta sẽ tiến hành xem liệu product đó có còn trong database hay không nhé !
Như ta thấy thì lúc này đã không còn product đó trong database nữa rồi (4).
BACKEND ERROR HANDLING
Creating Error Handler Class
Tóm tắt: Làm thế nào để ta có thể xử lí các lỗi ở phần backend? Và đôi khi ta buộc phải xử lí các lỗi async xảy ra trong các method controller Đầu tiên, ta sẽ tạo 1 class có tên là errorHandler trong folder utils Ngay bây giờ, ta không thể sử dụng ngay class này được vì ta phải tạo ra các error và sau đó mới có thể dùng class này để xử lí các lỗi.
Creating Errors Middleware
Tóm tắt: Trong video này, ta sẽ create middleware cho các error. Đầu tiên, ta tạo ra một folder có tên là “middlewares”, tại đây ta tạo một file có tên là error.js
Ta chứa function của module trong này.
Trong file app.js để dùng hàm mới tạo ở trên.
Và bên folder controller -> productController.js
Ta thực dùng hàm ErrorHandler thay vì sử dụng cả một cấu trúc cũ.
Ta thử test trên postman.
Production Vs Development Errors
Tóm tắt: Tác giả đề cập là muốn phân loại giữa production error và development errror ra để show chính xác được message Ý chính là để quản lý các biến không phải là ENV bao gồm development và production.
Cookie không thể được truy cập bằng bất kì javascript nào bên phía client Mã Token có thể được lưu trong này một cách an toàn thay vì lưu trên local storage.
Bậy giờ ta thực hiện một đoạn code để triển khai điều này:
Trong file utils/jwtToken.js: Ở đây tạo một token, trong options ta tiến hành set thời gian hết hạn cho cookie và ta cũng lưu COOKIE_EXPIRES_TIME ở trong file env, thời gian hết hạn này được qui đổi về mili giây. httpOnly: true – điều này giúp bảo vệ token ngăn chặn truy cập vào trong cookie.
Hàm cookie nhận 3 tham số: tham số thứ nhất là tên của token, tham số thứ hai là mã của token đó, tham số thứ ba là options trong đó có chứa thời gian hết hạn cũng như phương thức httpOnly.
Bây giờ ta tiến hành thay đổi lại đoạn code xử lý đăng nhập.
6 Protect Routes from Unauthorized Users
Khi người dùng chưa được xác thực truy cập vào private route, hãy lấy token từ cookie, xác minh token để có thể chuyển hướng vai trò một cách phù hợp.
Bạn sẽ nhận một token từ phái client bằng cách sử dụng một package có tên là cookie-parser Import thư viện này vào trong app.js và nó được sử dụng như là một middleware.
Bây giờ tiến hành tạo một middleware để kiểm tra người dùng đã có token hay nói một cách khác là người dùng đã đăng nhập hay chưa.
Trong file middlewares/auth.js:
Trong middleware này sẽ thực hiện một số nghiệp vụ như sau:
Tiến hành lấy token trong cookies
Sau đó kiểm tra token có tồn tại hay không, nếu không tồn tại tức là người dùng chưa đăng nhập vào hệ thống.
Khi token tồn tại thì đi phân tích mã token này bằng hàm verify của jsonwebtoken Hàm này nhận vào hai tham số, tham số thứ nhất là chuỗi token, tham số thứ hai là khóa bí mật ban đầu đã mã hóa chuỗi này. Sau đó lưu user này vào trong req
Test middleware unauthorized user Đầu tiên tiến hành import middleware vào route cần được bảo vệ, trong ví dụ route cần được bảo vệ là thêm mới một sản phẩm (‘/admin/product/new’)
Sử dụng postman để kiểm tra:
Kiểm tra header của request ban đầu khi chưa đăng nhập không tồn tại cookie cũng như token.
Sau khi gửi request thêm mới product sẽ gửi thông báo Not login
Tiến hành login và sau đó kiểm tra trên header cookie có token
Sau đó gửi request lại thì thấy đã tạo sản phẩm thành công. Đó là toàn bộ quá trình để kiếm tra và bảo vệ route khi chưa đăng nhập vào hệ thống.
Chức năng logout là cho người dùng thoát khỏi hệ thống Để tạo chức năng này trong file controllers/authController.js
Trong hàm này thực hiện nghiệp vụ như sau: set token trong cookie thành null và set ngày hết hạn của cookie.
Sau đó tạo route ‘/logout’ trong route/auth.js
8 Authorize User Roles and Permissions Đây là bước sau khi user đã login được vào hệ thống tức là ngay sau bước authentication.
Về cơ bản ở bước authentication chúng ta tạo một token xác thực lưu vào cookies, mỗi request người dùng gửi lên đều phải đi kèm với token đó, nếu đúng token thì người dùng mới có thể gọi được tới những api mà chúng ta yêu cầu xác thực.
Giờ tạo một hàm để kiểm tra đối với người đã đăng nhập vào hệ thống có role là gì và đối với role của họ thì có thể truy cập vào resource hay không.Trong file middlewares/auth.js
Trong file này thực hiện một số logic như sau: hàm authorizationRoles này sẽ nhận vào list of roles và sau đó sẽ lấy role trong req.user đã đăng nhập đi so sánh Nếu role của user có tồn tại trong list of role có quyền vào resource này thì thực hiện hàm next(), nếu không thì sẽ trả về lỗi permission.
Giờ áp dụng middleware vào một số role cần kiểm tra, trong ví dụ sẽ sử dụng role thêm mới sản phẩm và chỉ có admin mới có quyền thêm mới.
Sử dụng postman để kiểm tra
Với role hiện tại là ‘user’ khi thực hiện request lên server thêm mới sản phẩm sẽ trả về lỗi không có quyền truy cập
- Khi thêm 1 sản phẩm mới vào danh sách sản phẩm thì sản phẩm này sẽ có thêm cột thông tin User_Id để biết được ai là người đã thêm sản phẩm này.
- Đầu tiên cần thêm cột UserID vào Product Model với:
+ type: Kiểu dữ liệu là ObjectId được MongoDB tự generate khi thêm 1 document
+ ref: mongoose sẽ hiểu là cần liên kết với model này
+ required: yêu cầu phải nhập trường này khi tạo product mới
- Tại hàm createProduct sẽ lấy Id đang được đăng nhập của người dùng gán vào biến UserID trong phần body của request
- Bây giờ chỉ cần khởi tạo product mới là UserID sẽ được nhập vào
- Dùng postman để kiểm tra khi thêm product mới thì đã có thông tin UserID đang đăng nhập.
- Import thư viện crypto để xử lý việc mã hoá
- Tạo phương thức Generate token khi reset password
+ randomBytes: tạo ra chuỗi 20byte ngẫu nhiên nhưng vẫn có độ phức tạp, sau đó convert về kiểu hexa
+ createHash: tạo ra mã hash với nội dung được hash ngẫu nhiên bằng thuật toán sha256
+ update: thay thế nội dung được hash bằng mã resetToken
+ digest: trả về chuỗi hexa nếu như hash thành công
+ resetPasswordExpire: khởi tạo thời gian cho token này là 30 phút
- Trước tiên cần tạo hàm sendEmail để thực hiện gửi mail đến người dùng
- Vào trang web mailtrap.io Sandbox Inboxes SMTP Settings Tại Integrations chọn Nodemailer, lúc này trang web sẽ tạo ra phương thức gửi mail bằng nodemailer
- Tạo hàm sendEmail tại vị trí src\app\utils\sendEmail.js
- Copy đoạn code trên web mailtrap.io dán vào hàm này, tạo object message để khai báo thông tin gửi mail như from, to, … (các giá trị đã được lưu trong file env)
- Các biến được khai báo trong file env
+ Các giá trị được tạo trên web mailtrap.io
+ Thông tin người gửi: from email, from name.
- Tạo phương thức forgotPassword để gửi email lấy lại password
+ Tìm kiếm email đã nhập dưới db, nếu không có sẽ trả về lỗi
+ Tạo biến resetToken từ hàm getResetPasswordToken
+ Lưu user với tuỳ chọn validateBeforeSave: false để tắt tính năng kiểm tra dữ liệu
+ resetUrl: link được tạo để người dùng truy cập vào để đổi mật khẩu
+ Tiến hành gửi email cho email người dùng đã nhập với tiêu đề ‘Shop Cake password recovery’
+ Nếu xảy ra lỗi sẽ xoá token mới được tạo và trả về lỗi 500
- Cấu hình router trong file src\routes\auth.js
- Kiểm tra bằng postman đã trả về thành công
- Kiểm tra mailtrap đã có mail được gửi đến
ADDING FILTER, PAGINATION, SEARCH
BACKEND AUTHENTICATION & AUTHORIZATION
Protect Routes from Unauthorized Users
Khi người dùng chưa được xác thực truy cập vào private route, hãy lấy token từ cookie, xác minh token để có thể chuyển hướng vai trò một cách phù hợp.
Bạn sẽ nhận một token từ phái client bằng cách sử dụng một package có tên là cookie-parser Import thư viện này vào trong app.js và nó được sử dụng như là một middleware.
Bây giờ tiến hành tạo một middleware để kiểm tra người dùng đã có token hay nói một cách khác là người dùng đã đăng nhập hay chưa.
Trong file middlewares/auth.js:
Trong middleware này sẽ thực hiện một số nghiệp vụ như sau:
Tiến hành lấy token trong cookies
Sau đó kiểm tra token có tồn tại hay không, nếu không tồn tại tức là người dùng chưa đăng nhập vào hệ thống.
Khi token tồn tại thì đi phân tích mã token này bằng hàm verify của jsonwebtoken Hàm này nhận vào hai tham số, tham số thứ nhất là chuỗi token, tham số thứ hai là khóa bí mật ban đầu đã mã hóa chuỗi này. Sau đó lưu user này vào trong req
Test middleware unauthorized user Đầu tiên tiến hành import middleware vào route cần được bảo vệ, trong ví dụ route cần được bảo vệ là thêm mới một sản phẩm (‘/admin/product/new’)
Sử dụng postman để kiểm tra:
Kiểm tra header của request ban đầu khi chưa đăng nhập không tồn tại cookie cũng như token.
Sau khi gửi request thêm mới product sẽ gửi thông báo Not login
Tiến hành login và sau đó kiểm tra trên header cookie có token
Sau đó gửi request lại thì thấy đã tạo sản phẩm thành công. Đó là toàn bộ quá trình để kiếm tra và bảo vệ route khi chưa đăng nhập vào hệ thống.
Logout User
Chức năng logout là cho người dùng thoát khỏi hệ thống Để tạo chức năng này trong file controllers/authController.js
Trong hàm này thực hiện nghiệp vụ như sau: set token trong cookie thành null và set ngày hết hạn của cookie.
Sau đó tạo route ‘/logout’ trong route/auth.js
Authorize User Roles and Permissions
Đây là bước sau khi user đã login được vào hệ thống tức là ngay sau bước authentication.
Về cơ bản ở bước authentication chúng ta tạo một token xác thực lưu vào cookies, mỗi request người dùng gửi lên đều phải đi kèm với token đó, nếu đúng token thì người dùng mới có thể gọi được tới những api mà chúng ta yêu cầu xác thực.
Giờ tạo một hàm để kiểm tra đối với người đã đăng nhập vào hệ thống có role là gì và đối với role của họ thì có thể truy cập vào resource hay không.Trong file middlewares/auth.js
Trong file này thực hiện một số logic như sau: hàm authorizationRoles này sẽ nhận vào list of roles và sau đó sẽ lấy role trong req.user đã đăng nhập đi so sánh Nếu role của user có tồn tại trong list of role có quyền vào resource này thì thực hiện hàm next(), nếu không thì sẽ trả về lỗi permission.
Giờ áp dụng middleware vào một số role cần kiểm tra, trong ví dụ sẽ sử dụng role thêm mới sản phẩm và chỉ có admin mới có quyền thêm mới.
Sử dụng postman để kiểm tra
Với role hiện tại là ‘user’ khi thực hiện request lên server thêm mới sản phẩm sẽ trả về lỗi không có quyền truy cập.
Adding User in Products
- Khi thêm 1 sản phẩm mới vào danh sách sản phẩm thì sản phẩm này sẽ có thêm cột thông tin User_Id để biết được ai là người đã thêm sản phẩm này.
- Đầu tiên cần thêm cột UserID vào Product Model với:
+ type: Kiểu dữ liệu là ObjectId được MongoDB tự generate khi thêm 1 document
+ ref: mongoose sẽ hiểu là cần liên kết với model này
+ required: yêu cầu phải nhập trường này khi tạo product mới
- Tại hàm createProduct sẽ lấy Id đang được đăng nhập của người dùng gán vào biến UserID trong phần body của request
- Bây giờ chỉ cần khởi tạo product mới là UserID sẽ được nhập vào
- Dùng postman để kiểm tra khi thêm product mới thì đã có thông tin UserID đang đăng nhập.
Generate Forgot Password token
- Import thư viện crypto để xử lý việc mã hoá
- Tạo phương thức Generate token khi reset password
+ randomBytes: tạo ra chuỗi 20byte ngẫu nhiên nhưng vẫn có độ phức tạp, sau đó convert về kiểu hexa
+ createHash: tạo ra mã hash với nội dung được hash ngẫu nhiên bằng thuật toán sha256
+ update: thay thế nội dung được hash bằng mã resetToken
+ digest: trả về chuỗi hexa nếu như hash thành công
+ resetPasswordExpire: khởi tạo thời gian cho token này là 30 phút
Send Password Recovery Email
- Trước tiên cần tạo hàm sendEmail để thực hiện gửi mail đến người dùng
- Vào trang web mailtrap.io Sandbox Inboxes SMTP Settings Tại Integrations chọn Nodemailer, lúc này trang web sẽ tạo ra phương thức gửi mail bằng nodemailer
- Tạo hàm sendEmail tại vị trí src\app\utils\sendEmail.js
- Copy đoạn code trên web mailtrap.io dán vào hàm này, tạo object message để khai báo thông tin gửi mail như from, to, … (các giá trị đã được lưu trong file env)
- Các biến được khai báo trong file env
+ Các giá trị được tạo trên web mailtrap.io
+ Thông tin người gửi: from email, from name.
- Tạo phương thức forgotPassword để gửi email lấy lại password
+ Tìm kiếm email đã nhập dưới db, nếu không có sẽ trả về lỗi
+ Tạo biến resetToken từ hàm getResetPasswordToken
+ Lưu user với tuỳ chọn validateBeforeSave: false để tắt tính năng kiểm tra dữ liệu
+ resetUrl: link được tạo để người dùng truy cập vào để đổi mật khẩu
+ Tiến hành gửi email cho email người dùng đã nhập với tiêu đề ‘Shop Cake password recovery’
+ Nếu xảy ra lỗi sẽ xoá token mới được tạo và trả về lỗi 500
- Cấu hình router trong file src\routes\auth.js
- Kiểm tra bằng postman đã trả về thành công
- Kiểm tra mailtrap đã có mail được gửi đến
Reset New Password
Tóm tắt: Nội dung chính của video này hướng dẫn chúng ta xây dựng api để reset password tiếp nối sau phần send password recovery email trước đó Tạo api resetPassword => /api/v1/password/reset/:token trong file authController.js
Mã hóa passwordToken với sha256 (SHA-256 là Thuật toán băm bảo mật 256 bit và dùng để tạo ra các hàm băm không thể đảo ngược và duy nhất.) sau đó đưa về dạng hex
Tìm user thông qua hai đầu vào resetPasswordToken và resetPasswordExpire lớn hơn ngày hiện tại.
Kiểm tra nếu không tìm thấy user nào thì thông báo lỗi 400 ‘Password reset token is invalid or has been expired’.
Tiếp tục kiểm tra nếu password và confirmPassword không giống nhau thì thông báo lỗi 400 ‘Password does not match’
Cập nhật password mới, cập nhật resetPasswordToken và resetPasswordExpire thành ‘undefined’ cho user sau đó lưu user lại và gửi token của user cho response
Thêm route resetPassword với phương thức PUT vào auth routes để sử dụng api resetPassword
Kiểm tra thử kết quả bằng Postman với PUT api
‘http://localhost:5000/api/v1/password/reset/bf98b1292e5398352b5007a40579 0640ad13e59b’ với token đã nhận được từ api forgot password trước đó.
Nếu password và passwordConfirm không giống nhau api sẽ trả về thông báo
Nếu password và passwordConfirm giống nhau api sẽ trả về thông tin của user đó
Kiểm tra password mới đã được cập nhật chưa bằng api login
Handle Wrong JWT Token & Expire JWT Error
Tóm tắt: Nội dung chính của video này là hướng dẫn cách handle hai lỗi jwt token, expire jwt và mongoose duplicate để dễ dàng kiểm soát lỗi hơn
Mongoose duplicate là lỗi khi mà ta tạo một trường dữ liệu nào đó 2 lần giống nhau nhưng nó đã được chỉ định là unique trước đó
Jwt token là lỗi khi truyền token vào api không chính xác.
Expire jwt là lỗi khi token được gửi vào email trước đó đã hết hạn khi dùng để reset lại password mới.
Sử dụng postman để kiểm tra handle các lỗi trên.
USER ROUTES
Show User Profile
Sau khi thực hiện việc login với token thì giờ thực hiện việc lấy ra thông tin cá nhân của người dùng Viết hàm thực hiện lấy thông tin người dùng trong file controllers/authController.js được thực hiện như sau:
Bởi vì sau khi thực hiện việc login success thì thông tin của user như id, name được lưu trữ trong payload, sau khi thực hiện decode thì payload này được gán lại trong req.user.
Thực hiện thêm 1 route cho việc xem thông tin cá nhân trong file routes/auth.js:
Hàm isAuthenticatedUser là một middleware xác thực việc user đã đăng nhập hay chưa.
Change Update Password
Tại file authCtroller.jsx Ở user sẽ lấy password được thêm vào Tiến hành kiểm tra với mật khẩu cũ Lưu lại user
Gửi thông báo tới user
Tại file auth.js thêm routes update password
Check qua postman nhập đúng mật khẩu cũ
Update User Profile
Tiến hành thực hiện trong file controllers/auth.js thêm hàm updateProfile như sau: Ở hàm update này nhận một form thông tin người dùng cần thay đổi thông tin, sau đó dựa vào id của người dùng để thực hiện việc update profile.Thêm 1 route ‘/me/update’ để thực hiện việc update:
Admin - Get All Users & Specific User
Tóm tắt: Admin lấy ra thông tin tất cả user và xem chi tiết user theo id Tại file AuthController.js
** Lấy thông tin all user
Tạo 1 cái export lấy tất cả user qua method find()
Tạo thêm 1 biến authorizeRoles vào requie middlewares/auth
Tạo thêm 1 cái route cho chức năng này
Vào postman check - nhận được 1 list object các user hiện có
** lấy ra thông tin chi tiết user theo id
Các bước làm tương tự lấy thông tin all user ta sẽ code thêm và thay đổi chút
Check trong postman nó sẽ chỉ hiện ra user theo id đã search
Admin - Update & Delete User
Phần 5 này các bước làm giống hệt phần 2 và các phần chỉ thay đổi code 1 xíu nên không có gì đáng để giải thích
Update nhận 1 cái req và update lại