Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Databases
Code

Sử dụng passport với sequelize và MySQL

by
Difficulty:IntermediateLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article)

Sequelize là một ORM Node.js dựa trên promise. Nó có thể được sử dụng với PostgreSQL, MySQL, MariaDB, SQLite và MSSQL. Trong hướng dẫn này, chúng tôi sẽ triển khai xác thực cho người dùng ứng dụng web. Và chúng tôi sẽ sử dụng Passport, middleware xác thực phổ biến cho Node, cùng với Sequelize và MySQL để thực hiện đăng ký người dùng và đăng nhập.

Bắt đầu

Đảm bảo bạn đã cài đặt các phần sau trên máy của mình:

  • Node
  • MySQL

Đối với hướng dẫn này, chúng tôi sẽ sử dụng Node.js cùng với Express, vì vậy chúng tôi sẽ tiếp tục bắt đầu cài đặt những gì chúng tôi cần.

Bước 1: Tạo file package.json

Tạo thư mục cho ứng dụng của bạn. Bên trong thư mục này, chạy lệnh này từ terminal hoặc command prompt của bạn:

Điều này khởi tạo trình quản lý phụ thuộc npm. Điều này sẽ trình bày một loạt các lời nhắc mà chúng tôi sẽ nhanh chóng đi qua.

  • Nhập tên ứng dụng của bạn mà không có dấu cách và nhấn Enter cho 'name'.
  • Nhấn Enter cho 'phiên bản'.
  • Đối với 'description', trong hướng dẫn này, chúng ta sẽ gõ "Using Passport with Sequelize and MySQL" làm mô tả và nhấn Enter. Điều này cũng có thể được để trống.
  • Đối với 'entry point (index.js)', gõ server.js và nhấn Enter.
  • Đối với 'lệnh kiểm tra', nhấn Enter.
  • Đối với 'kho git', bạn có thể nhập repo git nơi ứng dụng của bạn cư trú nếu bạn có hoặc chỉ cần nhấn Enter để để trống trường này.
  • Đối với 'Từ khóa', nhấn Enter.
  • Đối với 'tác giả', nhấn Enter hoặc nhập tên của bạn trước khi thực hiện điều đó.
  • Đối với 'giấy phép', nhấn Enter.
  • Đối với '(Đây có phải là không)', điều này cho bạn thấy những gì package.json của bạn sẽ như thế nào. Nhập Có và nhấn Enter.

Bước 2: Cài đặt phụ thuộc

Các phụ thuộc chính cho hướng dẫn này là:

  • Express
  • Sequelize
  • MySQL
  • Passport
  • Passport Chiến lược địa phương
  • Phân tích cú pháp nội dung
  • Express Section
  • Bcrypt Nodejs
  • Express Handlebars cho các view

Để cài đặt chúng, từ command prompt hoặc terminal của bạn, hãy chạy câu lệnh sau.

Nếu bạn đang sử dụng Git cho dự án này:

Trong thư mục dự án của bạn, hãy tạo file .gitignore.

Thêm dòng này vào file .gitignore.

node_modules

Bước 3: Thiết lập ứng dụng

Bây giờ, chúng ta tạo một file máy chủ. Đây sẽ là file chính được gọi khi bạn nhập như sau:

File này chạy ứng dụng. Bạn cũng có thể chạy ứng dụng bằng cách nhập node server.js.

Sau đó, trong thư mục dự án của chúng tôi, chúng tôi tạo một file mới và đặt tên file này là server.js.

Bên trong file server.js, chúng tôi thêm vào như sau:

Dòng đầu tiên gán mô-đun thể hiện cho một biến thể hiện. Sau đó, chúng tôi khởi tạo nhanh và đặt tên cho nó là biến: ứng dụng.

Sau đó, chúng tôi làm cho ứng dụng nghe trên cổng 5000. Bạn có thể chọn bất kỳ số cổng miễn phí nào trên máy tính của mình.

Tiếp theo, chúng ta gọi hàm app.get() express để trả lời với "Welcome to Passport with Sequelize" khi một yêu cầu GET được gửi tới "/".

Để kiểm tra trên máy tính của bạn, hãy chạy nó từ bên trong thư mục dự án của bạn:

Nếu bạn thấy dòng chữ "Welcome to Passport with Sequelize" khi bạn truy cập http://localhost:5000/ sau đó xin chúc mừng! Nếu không, hãy kiểm tra xem bạn đã làm mọi thứ chính xác như được viết ở trên chưa.

Tiếp theo, chúng tôi nhập một số mô-đun chúng tôi cần, như passport, phiên giao dịch và phân tích cú pháp nội dung.

Sau var app = express() chúng ta thêm các dòng sau:

Trong hai dòng đầu tiên, chúng tôi nhập mô-đun passport và phiên thể hiện, cả hai đều cần xử lý xác thực.

Sau đó, chúng tôi nhập mô-đun phân tích cú pháp nội dung. Thao tác này trích xuất toàn bộ phần nội dung của một yêu cầu đến và hiển thị nó theo một định dạng dễ làm việc hơn. Trong trường hợp này, chúng tôi sẽ sử dụng định dạng JSON.

Để ứng dụng của chúng tôi sử dụng trình phân tích cú pháp nội dung, chúng tôi thêm các dòng này vào một số khoảng trống bên dưới các dòng nhập:

Tiếp theo, chúng tôi khởi tạo passport và phiên giao dịch và phiên passport và thêm cả hai làm middleware. Chúng tôi làm điều này bằng cách thêm những dòng này một số khoảng trắng sau dòng nhập bodyParser.

Chúng tôi sẽ bắt đầu làm việc trên xác thực thực tế ngay bây giờ.

Chúng tôi sẽ thực hiện việc này theo bốn bước:

  • Thiết lập Sequelize với MySQL.
  • Tạo model User.
  • Thiết lập view.
  • Viết một chiến lược passport.

1. Thiết lập Sequelize với MySQL

Đầu tiên, chúng ta tạo một database trong MySQL. Đặt nó làm tên ưa thích của bạn. Phục vụ cho mục đích của hướng dẫn này, chúng ta hãy tạo một database có tên là sequelize_passport trong MySQL.

Sau đó, chúng tôi thiết lập cấu hình để xử lý các thông tin DB.

Trước tiên, hãy nhập mô-đun dot-env để xử lý các biến môi trường.

Chạy nó trong thư mục gốc dự án của bạn:

Sau đó, chúng tôi nhập nó vào file máy chủ chính, server.js, ngay bên dưới các mục nhập khác.

Tiếp theo, chúng ta tạo một file trong thư mục dự án và đặt tên nó là .env.

Bước tiếp theo cần làm là tùy chọn nếu bạn không sử dụng Git:

Chúng tôi sẽ thêm file .env vào file .gitignore của bạn.

File .gitignore của bạn sẽ trông giống như sau:

Sau đó, chúng ta thêm môi trường của chúng ta vào file .env bằng cách thêm dòng này:

NODE_ENV = 'phát triển'

Sau đó, chúng ta tạo một file tin config.json sẽ được sử dụng bởi Sequelize để quản lý các môi trường khác nhau.

Điều đầu tiên cần làm là tạo một thư mục có tên là config trong thư mục dự án của chúng tôi. Bên trong thư mục này, chúng ta tạo một file tin config.json. File này nên được bỏ qua nếu bạn đang đẩy đến một kho lưu trữ. Để thực hiện việc này, hãy thêm mã sau vào .gitignore của bạn:

config/config.json

Sau đó, chúng ta thêm vào đoạn mã sau vào file config.json của chúng ta.

Hãy nhớ thay thế các giá trị trong khối phát triển ở trên bằng các chi tiết xác thực database của bạn.

Tiếp theo, chúng tôi cài đặt sequelize với npm. Để thực hiện việc này, hãy chạy lệnh sau trong thư mục gốc của dự án:

Bây giờ là lúc tạo thư mục mô hình.

Đầu tiên, chúng ta tạo một thư mục có tên app trong thư mục dự án của chúng ta.

Bên trong thư mục app, chúng tôi tạo một thư mục mới có tên là models và tạo một file mới có tên là index.js trong thư mục models.

Bên trong file index.js, chúng tôi thêm vào mã bên dưới.

File này được sử dụng để nhập tất cả các mô hình chúng tôi đặt vào thư mục mô hình và xuất chúng.

Để kiểm tra tất cả là tốt, chúng tôi thêm điều này vào file server.js của chúng tôi.

Ở đây, chúng tôi đang nhập các mô hình, và sau đó gọi chức năng đồng bộ hóa Sequelize.

Chạy cái này để xem tất cả có tốt không:

Nếu bạn nhận được thông báo "Trang web đang hoạt động Tốt đẹp! Cơ sở dữ liệu trông ổn", sau đó bạn đã thiết lập Sequelize thành công.

Nếu không, hãy đi cẩn thận qua các bước ở trên và cố gắng gỡ lỗi sự cố với trợ giúp.

2. Tạo Mô hình Người dùng

Điều tiếp theo chúng ta sẽ làm là tạo ra model User, về cơ bản là bảng người dùng. Điều này sẽ chứa thông tin người dùng cơ bản.

Trong thư mục models của chúng tôi, chúng tôi tạo một file và đặt tên là user.js. Đường dẫn đầy đủ cho file này phải là app/models/user.js.

Mở file user.js và thêm mã sau:

Bây giờ chạy:

Bạn sẽ thấy quen thuộc "Site is live. Nice! Database looks fine." thông điệp. Điều này có nghĩa rằng các mô hình Sequelize của chúng tôi đã được đồng bộ hóa thành công và nếu bạn kiểm tra database của mình, bạn sẽ thấy bảng người dùng với các cột được chỉ định hiện tại.

3: Thiết lập view

Trước tiên, hãy tạo view để đăng ký và kết nối nó.

Điều đầu tiên cần làm là nhập khẩu mô-đun tay lái nhanh mà chúng tôi sử dụng cho các view trong hướng dẫn này.

Thêm dòng này vào file bắt đầu chính, server.js.

var exphbs = require ('express-handlebars')

Khối nhập của bạn sẽ trông như thế này vào thời điểm này.

Tiếp theo, chúng tôi thêm các dòng sau vào file server.js của chúng tôi.

Bây giờ, trong thư mục app của chúng tôi, chúng tôi tạo ba thư mục có tên là views, controllersroutes.

Trong thư mục views, chúng ta tạo một file có tên signup.hbs và thêm vào đoạn code bên dưới vào nó.

Sau đó trong thư mục controllers của chúng ta, chúng ta tạo một file mới và đặt tên nó là authcontroller.js.

Trong file này, chúng tôi thêm vào controller sau cho route đăng ký mà chúng tôi sẽ tạo trong giây lát.

Tiếp theo, chúng tôi tạo một route để đăng ký. Trong thư mục routes, chúng ta tạo một file mới có tên auth.js và sau đó, trong file này, chúng ta nhập trình điều khiển auth và xác định tuyến đăng ký.

Bây giờ, chúng tôi sẽ nhập tuyến đường này trong server.js của chúng tôi và chuyển ứng dụng dưới dạng đối số.

Trong máy chủ, sau khi nhập mô hình, hãy thêm các dòng sau:

Chạy này:

Bây giờ, hãy truy cập http://localhost:5000/ đăng ký và bạn sẽ thấy biểu mẫu đăng ký.

Hãy lặp lại các bước cho biểu mẫu đăng nhập. Như trước đây, chúng tôi sẽ tạo một file có tên signin.hbs trong thư mục lượt xem của chúng tôi và thêm vào mã HTML sau vào đó:

Sau đó, thêm một bộ điều khiển cho đăng nhập trong app/controllers/authcontroller.js.

Sau đó, trong app/routes/auth.js, chúng tôi thêm route cho đăng nhập như sau:

app.get ('/ signin', authController.signin);

Bây giờ khi bạn chạy:

và truy cập http://localhost:5000/signin/, bạn sẽ thấy biểu mẫu đăng nhập.

Bước cuối cùng và chính là viết các chiến lược passport của chúng tôi.

4. Viết một chiến lược passport

Trong app/config, chúng ta tạo một thư mục mới có tên là passport.

Sau đó trong ứng dụng app/config/passport mới của chúng tôi, chúng tôi tạo một file mới và đặt tên là passport.js. File này sẽ chứa các chiến lược passport của chúng tôi.

Trong passport.js, chúng tôi sẽ sử dụng model User và passport.

Đầu tiên, chúng tôi nhập bcrypt mà chúng tôi cần để bảo mật mật khẩu.

var bCrypt = require ('bcrypt-nodejs');

Sau đó, chúng ta thêm một module.exports như sau:

Bên trong block này, chúng tôi khởi tạo chiến lược passport địa phương và model User sẽ được chuyển thành đối số. Dưới đây là cách chúng tôi thực hiện việc này:

Sau đó, chúng tôi xác định chiến lược tùy chỉnh của mình với ví dụ về LocalStrategy như sau:

Bây giờ chúng tôi đã tuyên bố những gì yêu cầu (req) lĩnh vực của chúng tôi usernameField và passwordField (biến passport) được.

Biến passReqToCallback cuối cùng cho phép chúng tôi chuyển toàn bộ yêu cầu đến cuộc gọi lại, đặc biệt hữu ích khi đăng ký.

Sau dấu phẩy cuối cùng, chúng ta thêm hàm gọi lại này.

Trong chức năng này, chúng tôi sẽ xử lý lưu trữ chi tiết của người dùng.

Đầu tiên, chúng ta thêm hàm tạo mật khẩu băm của chúng ta bên trong hàm gọi lại.

Sau đó, sử dụng model User Sequelize mà chúng tôi đã khởi tạo trước đó là Người dùng, chúng tôi kiểm tra xem liệu người dùng đã tồn tại hay chưa và liệu chúng tôi có thêm họ không.

User.create() là một phương thức Sequelize để thêm các mục mới vào database. Lưu ý rằng các giá trị trong đối tượng dữ liệu được lấy từ đối tượng req.body chứa đối tượng đầu vào từ biểu mẫu đăng ký của chúng tôi.

Passport.js của bạn sẽ trông giống như sau:

Bây giờ chúng ta sẽ nhập chiến lược trong server.js.

Để thực hiện điều này, chúng tôi thêm những dòng này bên dưới các tuyến nhập trong server.js.

Server.js của bạn sẽ trông như thế này vào lúc này:

Bây giờ chúng tôi sẽ thực sự áp dụng chiến lược cho tuyến đăng ký / của chúng tôi.

Đây là cách chúng tôi làm điều đó:

Trước tiên, chúng tôi chuyển đến app/routes/auth.js và thêm tuyến đường để đăng lên đăng ký như thế này.

Vì chúng ta cần passport, chúng ta cần chuyển nó cho phương pháp này. Chúng tôi có thể nhập passport trong tập lệnh này hoặc chuyển nó từ server.js. Hãy làm điều sau.

Sửa đổi hàm được xuất trong ứng dụng file app/routes/auth.js này để có passport làm thông số. Mã trong app/routes/auth.js sẽ giống như sau khi bạn sửa đổi.

Sau đó trong server.js, chúng tôi sửa đổi các tuyến nhập và thêm passport làm đối số như sau:

var authRoute = require('./app/routes/auth.js')(app,passport);

Bây giờ, hãy truy cập URL đăng ký http://localhost:5000/signup/ và thử đăng ký.

Khi bạn cố gắng đăng ký, bạn sẽ gặp lỗi "Failed to serialize user into session". Điều này là do passport phải lưu một ID người dùng trong phiên và nó sử dụng điều này để quản lý truy xuất chi tiết người dùng khi cần.

Để giải quyết vấn đề này, chúng tôi sẽ triển khai cả hai chức năng serialize và deserialize của passport trong file app / config / passport / passport.js của chúng tôi.

Đầu tiên chúng ta thêm hàm serialize. Trong chức năng này, chúng tôi sẽ lưu user id vào phiên.

Để làm điều này, chúng tôi thêm các dòng sau đây dưới sự khởi tạo của chiến lược địa phương.

Tiếp theo, chúng tôi thực hiện chức năng deserialize. Thêm hàm ngay bên dưới hàm tuần tự hóa.

Trong hàm deserialize ở trên, chúng ta sử dụng lời hứa Sequelize findById để lấy người dùng, và nếu thành công, một cá thể của mô hình Sequelize được trả về. Để có được đối tượng User từ thể hiện này, chúng ta sử dụng chức năng Sequelize getter như sau: user.get().

Bây giờ chạy lại:

Và cố gắng đăng ký. Hoan hô nếu bạn có "Không thể GET / bảng điều khiển"! Nó có nghĩa là xác thực của chúng tôi đã thành công. Hãy nhớ rằng chúng tôi đã chuyển hướng đến / trang tổng quan trong phương thức passport của chúng tôi.hủy xác thực trong các tuyến đường / auth.js.

Bây giờ chúng ta hãy tiếp tục thêm route đó. Sau đó, thêm middleware để đảm bảo trang chỉ có thể được truy cập khi người dùng đăng nhập vào session.

Trong thư mục app/views của chúng tôi, chúng tôi tạo file mới có tên dashboard.hbs và thêm mã HTML sau vào thư mục đó.

Trong các route / auth.js, chúng ta thêm dòng này bên trong khối module.exports:

app.get('/dashboard',authController.dashboard);

Tiếp theo, chúng ta đi đến app/controllers/authController.js và thêm bộ điều khiển bảng điều khiển.

AuthController.js của bạn sẽ trông như thế này:

Bây giờ, hãy chạy lại ứng dụng và thử đăng ký bằng địa chỉ email khác với địa chỉ bạn đã sử dụng trước đó. Bạn sẽ được chuyển hướng thích hợp đến route /dashboard.

Nhưng /dashboard không phải là route được bảo vệ, điều đó có nghĩa là ngay cả khi người dùng chưa đăng nhập, họ có thể nhìn thấy nó. Chúng tôi không muốn điều này, vì vậy chúng tôi sẽ thêm một route /logout để đăng nhập người sử dụng, và sau đó bảo vệ các tuyến đường và kiểm tra những gì chúng tôi đã làm.

Làm thôi nào:

Trong routes/auth.js, chúng tôi thêm dòng này:

app.get('/logout',authController.logout);

Sau đó, chúng ta thêm bộ điều khiển trong app/controllers/authController.js.

Bây giờ hãy chạy lại ứng dụng và đăng ký bằng một địa chỉ email khác.

Sau đó, hãy truy cập http://localhost:5000/logout để đăng xuất người dùng. Bây giờ hãy truy cập http://localhost:5000/dashboard.

Bạn sẽ nhận thấy rằng nó là khá dễ tiếp cận. Hãy thêm một middleware tùy chỉnh để bảo vệ route đó.

Để làm điều này, chúng ta mở app/routes/auth.js và thêm hàm này vào module.exports, bên dưới tất cả các dòng code khác.

Sau đó, chúng tôi sửa đổi handler của route trong dashboard để trông giống như sau:

app.get('/dashboard',isLoggedIn, authController.dashboard);

Bây giờ, khi bạn chạy lại ứng dụng và thử truy cập trang dashboard và bạn chưa đăng nhập, bạn sẽ được chuyển hướng đến trang đăng nhập.

Whew! Đã đến lúc triển khai phần cuối cùng: đăng nhập.

Trước tiên, chúng tôi sẽ thêm một chiến lược địa phương mới để đăng nhập trong app/config/passport/passport.js.

Trong chiến lược này, hàm isValidPassword so sánh mật khẩu được nhập với phương thức so sánh bCrypt vì chúng tôi đã lưu mật khẩu bằng bcrypt.

Nếu chi tiết chính xác, người dùng của chúng tôi sẽ đăng nhập.

Bây giờ hãy chuyển đến tuyến đường / auth.js và thêm tuyến đường để đăng lên / đăng nhập.

routes/auth.js của bạn sẽ trông như thế này khi bạn hoàn tất.

Bây giờ hãy chạy ứng dụng và thử đăng nhập. Bạn sẽ có thể đăng nhập bằng bất kỳ chi tiết nào bạn đã sử dụng khi đăng ký và bạn sẽ được chuyển đến http://localhost:5000/dashboard/.

Xin chúc mừng nếu bạn đã đi hết hướng dẫn này! Chúng tôi đã sử dụng thành công Sequelize và Passport với database MySQL.

Code đầy đủ cho hướng dẫn này có thể được tìm thấy trên GitHub.

Tổng kết

Điều này kết thúc hướng dẫn của chúng tôi về việc sử dụng Passport để xác thực người dùng với Sequelize và MySQL. Sequelize là một ORM thực sự hữu ích để xử lý MySQL khi sử dụng Node. Cá nhân tôi thấy nó rất hữu ích và bạn chắc chắn nên cân nhắc việc sử dụng nó trong ứng dụng Node-MySQL tiếp theo của mình.

Tài liệu tham khảo

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.