Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sử dụng Passport với Sequelize và MySQL

Sequelize là một ORM Node.js dựa trên lời hứa. 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, phần mềm trung gian xác thực phổ biến cho Node, cùng với Sequelize và MySQL để thực hiện đăng ký và đăng nhập của người dùng.

Bắt đầu

Đảm bảo rằng bạn đã cài đặt những thứ sau trên máy của mình:

  • Nút
  • 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 tiếp tục và bắt đầu cài đặt những gì chúng tôi cần.

Bước 1:Tạo tệp package.json

Tạo một thư mục cho ứng dụng của bạn. Bên trong thư mục này, hãy chạy nó từ thiết bị đầu cuối hoặc dấu nhắc lệnh của bạn:

 npm init 

Thao tác này khởi chạy Trình quản lý phụ thuộc npm. Điều này sẽ đưa ra một loạt lời nhắc mà chúng ta sẽ nhanh chóng xem qua.

  • Nhập tên ứng dụng của bạn không có dấu cách và nhấn Enter cho 'tên'.
  • Nhấn Enter để có 'phiên bản'.
  • Đối với 'mô tả', trong hướng dẫn này, chúng tôi sẽ nhập "Sử dụng Hộ chiếu với Sequelize và MySQL" làm mô tả và nhấn Enter. Phần này cũng có thể để trống.
  • Đối với 'entry point (index.js)', hãy nhập server.js và nhấn Enter.
  • Đối với 'lệnh kiểm tra', nhấn Enter.
  • Đối với 'kho lưu trữ git', bạn có thể nhập kho lưu trữ 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.
  • Đối với 'Từ khoá', hãy nhấn Enter.
  • Đối với 'tác giả', hãy nhấn Enter hoặc nhập tên của bạn trước khi thực hiện việc đó.
  • Đối với 'giấy phép', hãy nhấn Enter.
  • Đối với '(Điều này có ổn không)', điều này cho bạn biết package.json của bạn sẽ trông như thế nào. Nhập Yes và nhấn Enter.

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

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

  • Express
  • Sắp xếp theo thứ tự
  • MySQL
  • Hộ chiếu
  • Hộ chiếu Chiến lược địa phương
  • Trình phân tích cú pháp nội dung
  • Phiên cấp tốc
  • Bcrypt Nodejs
  • Ghi đông Express cho các chế độ xem

Để cài đặt chúng, từ thiết bị đầu cuối hoặc dấu nhắc lệnh của bạn, hãy chạy cái sau.

 npm install express --savenpm install sequize --savenpm install mysql --savenpm install passport --savenpm install passport-local --savenpm install body-parser --savenpm install express-session --savenpm install bcrypt-nodejs - -savenpm cài đặt express-handlebars --save 

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 một tệp .gitignore.

Thêm dòng này vào tệp .gitignore.

node_modules

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

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

 npm bắt đầu 

Điều 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.

 node server.js 

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

Bên trong server.js tệp, chúng tôi dán như sau:

 var express =demand ('express'); var app =express (); app.get ('/', function (req, res) {res.send ('Chào mừng bạn đến với Passport with Sequelize');}); app.listen (5000, function (err) {if (! err) console.log ("Trang web đang hoạt động"); else console.log (err)}); 

Dòng đầu tiên gán mô-đun express cho một biến express. Sau đó, chúng tôi khởi tạo express và đặt tên cho nó là một biến:app.

Sau đó, chúng tôi làm cho ứng dụng lắ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 tôi gọi app.get() chức năng định tuyến nhanh để phản hồi với "Chào mừng bạn đến với Passport with Sequelize" khi yêu cầu GET được thực hiện cho "/".

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

 node server.js 

Nếu bạn thấy dòng chữ "Chào mừng bạn đến với Passport with Sequelize" khi truy cập http:// localhost:5000 / thì xin chúc mừng! Nếu không, hãy kiểm tra xem bạn đã thực hiện mọi thứ chính xác như đã 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, express-session và body-parser.

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

 var passport =demand ('passport') var session =request ('express-session') var bodyParser =request ('body-parser') 

Trong hai dòng đầu tiên, chúng tôi nhập mô-đun hộ chiếu và phiên cấp tốc, cả hai đều chúng tôi 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 sẽ 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ó ở đị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.

Để cho phép ứ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 vào các dòng này một số khoảng trắng bên dưới các dòng nhập:

 // Đối với BodyParserapp.use (bodyParser.urlencoded ({extension:true})); app.use (bodyParser.json ()); 

Tiếp theo, chúng tôi khởi tạo hộ chiếu và phiên cấp tốc và phiên hộ chiếu và thêm chúng làm phần mềm trung gian. Chúng tôi thực hiện việc này bằng cách thêm các dòng này một số khoảng trắng sau dòng nhập bodyParser.

 // Dành cho Passportapp.use (session ({secret:'keyboard cat', resave:true, saveUninitialized:true})); // phiên secretapp.use (passport.initialize ()); app.use (passport.session ()); // phiên đăng nhập liên tục 

Chúng tôi sẽ bắt đầu làm việc 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 mô hình người dùng.
  • Thiết lập chế độ xem.
  • Viết chiến lược hộ chiếu.

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

Đầu tiên, chúng tôi tạo một Cơ sở dữ liệu trong MySQL. Đặt cho nó cái tên ưa thích của bạn. Vì lợi ích của hướng dẫn này, hãy tạo một cơ sở dữ liệu có tên sequelize_passport trong MySQL.

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

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

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

 npm install --save dotenv 

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

 var env =demand ('dotenv'). load (); 

Tiếp theo, chúng tôi tạo một tệp trong thư mục dự án của chúng tôi và đặt tên là .env.

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

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

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

 node_modules.env 

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

NODE_ENV='development'

Sau đó, chúng tôi tạo một tệp config.json sẽ được Sequelize sử dụng để 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 config trong thư mục dự án của chúng tôi. Bên trong thư mục này, chúng tôi tạo một cấu hình. json tập tin. Tệp này nên được bỏ qua nếu bạn đang đẩy vào 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 tôi dán đoạn mã sau vào tệp config.json của chúng tôi.

 {"development":{"username":"root", "password":null, "database":"inheritize_passport", "host":"127.0.0.1", "dialect":"mysql"}, "test":{"username":"", "password":null, "database":"", "host":"", "dialect":"mysql"}, "production":{"username":"", "mật khẩu":null, "cơ sở dữ liệu":"", "máy chủ lưu trữ":"127.0.0.1", "phương ngữ":"mysql"}} 

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 cơ sở dữ liệu của bạn.

Tiếp theo, chúng tôi cài đặt phần tiếp theo 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:

 npm install - lưu phần tiếp theo 

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

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

Bên trong ứng dụng thư mục, chúng tôi tạo một thư mục mới có tên là mô hình và tạo một tệp mới có tên là index.js trong các mô hình thư mục.

Bên trong tệp index.js, chúng tôi dán mã bên dưới.

 "sử dụng nghiêm ngặt"; var fs =request ("fs"); var path =request ("path"); var Sequelize =Required ("phần tiếp theo"); var env =process.env.NODE_ENV || "development"; var config =request (path.join (__ dirname, '..', 'config', 'config.json')) [env]; var sequize =new Sequelize (config.database, config.username, config .password, config); var db ={}; fs .readdirSync (__ dirname) .filter (function (file) {return (file.indexOf (".")! ==0) &&(file! =="index. js ");}) .forEach (function (file) {var model =sequize.import (path.join (__ dirname, file)); db [model.name] =model;}); Object.keys (db). forEach (function (modelName) {if ("Associate" in db [modelName]) {db [modelName] .associate (db);}}); db.sequelize =sequize; db.Sequelize =Sequelize; module.exports =db; 

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

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

 // Modelsvar models =request ("./ app / models"); // Sync Databasemodels.sequelize.sync (). then (function () {console.log ('Đẹp! Cơ sở dữ liệu trông ổn')}) .catch (function (err) {console.log (err, "Đã xảy ra lỗi với Cập nhật Cơ sở dữ liệu!")}); 

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 theo trình tự.

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

 node server.js 

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

Nếu không, vui lòng thực hiện cẩn thận các bước ở trên và cố gắng gỡ lỗi vấn đề với sự 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 mô hình người dùng, 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 các mô hình của chúng tôi thư mục, chúng tôi tạo một tệp và đặt tên là user.js . Đường dẫn đầy đủ cho tệp này phải là app / models / user.js.

Mở tệp user.js và thêm mã sau:

 module.exports =function (inheritize, Sequelize) {var User =inheritize.define ('user', {id:{autoIncrement:true, primaryKey:true, type:Sequelize.INTEGER}, firstname:{type:Sequelize .STRING, notEmpty:true}, lastname:{type:Sequelize.STRING, notEmpty:true}, tên người dùng:{type:Sequelize.TEXT}, about:{type:Sequelize.TEXT}, email:{type:Sequelize.STRING , xác thực:{isEmail:true}}, mật khẩu:{type:Sequelize.STRING, allowNull:false}, last_login:{type:Sequelize.DATE}, trạng thái:{type:Sequelize.ENUM ('hoạt động', 'không hoạt động' ' ), defaultValue:'active'}}); trả lại người dùng;} 

Bây giờ chạy:

 node server.js 

Bạn sẽ thấy thông báo quen thuộc " Trang web đang hoạt động. Thật tuyệt! Cơ sở dữ liệu có vẻ ổn. ". Điều này có nghĩa là 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 cơ sở dữ liệu của mình, bạn sẽ thấy một bảng người dùng với các cột được chỉ định.

3:Thiết lập chế độ xem

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

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

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

var exphbs = require('express-handlebars')

Tại thời điểm này, khối nhập của bạn sẽ trông giống như thế này.

 var express =demand ('express') var app =express () var passport =request ('passport') var session =demand ('express-session') var bodyParser =request ('body-parser') var env =demand ('dotenv'). load () var exphbs =request ('express-handlebars') 

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

 // Dành cho Handlebarsapp.set ('views', './app/views')app.engine('hbs', exphbs ({extname:'.hbs'})); app.set ('view engine ',' .hbs '); 

Bây giờ, trong thư mục ứng dụng của chúng tôi, chúng tôi tạo ba thư mục có tên là chế độ xem, bộ điều khiển, tuyến đường .

Trong thư mục chế độ xem, chúng tôi tạo một tệp có tên là đăng ký. hbs và dán mã bên dưới vào đó.

        

Sau đó, trong bộ điều khiển của chúng tôi thư mục, chúng tôi tạo một tệp mới và đặt tên là authcontroller.js.

Trong tệp này, chúng tôi dán bộ điều khiển sau cho lộ trình đăng ký mà chúng tôi sẽ tạo trong giây lát.

 var export =module.exports ={} export.signup =function (req, res) {res.render ('signup');} 

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

 var authController =request ('../ controllers / authcontroller.js'); module.exports =function (app) {app.get ('/ signup', authController.signup);} 

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

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

 // Routesvar authRoute =request ('./ app / route / auth.js') (app); 

Chạy cái này:

 node server.js 

Bây giờ, hãy truy cập http:// localhost:5000 / signup 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 tệp có tên là signin.hbs trong thư mục chế độ xem của chúng tôi và dán mã HTML sau vào đó:

        

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

 export.signin =function (req, res) {res.render ('signin');} 

Sau đó, trong app / route / auth.js , chúng tôi thêm một tuyến đường để đăng nhập như sau:

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

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

 node server.js 

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 làm hộ chiếu của chúng tôi.

4. Viết chiến lược hộ chiếu

Trong ứng dụng / cấu hình , chúng tôi tạo một thư mục mới có tên là hộ chiếu.

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

Trong passport.js , chúng tôi sẽ sử dụng mô hình người dùng và hộ chiếu.

Đầ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 tôi thêm một khối module.exports như sau:

 module.exports =function (passport, user) {} 

Bên trong khối này, chúng tôi khởi tạo chiến lược địa phương hộ chiếu và mô hình người dùng, sẽ được chuyển như một đối số. Đây là cách chúng tôi thực hiện việc này:

 module.exports =function (passport, user) {var User =user; var LocalStrategy =request ('passport-local'). Strategy;} 

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

 passport.use ('local-signup', new LocalStrategy ({usernameField:'email', passwordField:'password', passReqToCallback:true // cho phép chúng tôi gửi lại toàn bộ yêu cầu cho callback},)); 

Bây giờ chúng tôi đã khai báo yêu cầu nào ( req ) Các trường usernameField và passwordField (biến hộ chiếu) của chúng tôi là.

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

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

 chức năng (yêu cầu, email, mật khẩu, xong) {} 

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

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

 var createHash =function (password) {return bCrypt.hashSync (password, bCrypt.genSaltSync (8), null); }; 

Sau đó, bằng cách sử dụng mô hình người dùng 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 người dùng đã tồn tại chưa và nếu chưa, chúng tôi sẽ thêm họ.

 User.findOne ({where:{email:email}}). then (function (user) {if (user) {return done (null, false, {message:'Email đó đã được sử dụng'}); } else {var userPassword =createHash (password); var data ={email:email, password:userPassword, firstname:req.body.firstname, lastname:req.body.lastname}; User.create (data) .then (function (newUser, đã tạo) {if (! newUser) {return done (null, false);} if (newUser) {return done (null, newUser);}});}}); 

User.create() là một phương pháp Sequelize để thêm các mục nhập mới vào cơ sở dữ liệu. Lưu ý rằng các giá trị trong dữ liệu đối tượng được lấy từ req.body đối tượng chứa đầ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 như thế này:

 // tải bcryptvar bCrypt =request ('bcrypt-nodejs'); module.exports =function (passport, user) {var User =user; var LocalStrategy =request ('passport-local'). Strategy; passport.use ('local-signup', new LocalStrategy ({usernameField:'email', passwordField:'password', passReqToCallback:true // cho phép chúng tôi gửi lại toàn bộ yêu cầu tới callback}, function (req, email, mật khẩu, xong) {var createHash =function (password) {return bCrypt.hashSync (password, bCrypt.genSaltSync (8), null);}; User.findOne ({where:{email:email}}). then (function (user) {if (user) {return done (null, false, {message:'Email đó đã được sử dụng'});} else {var userPassword =createHash (password); var data ={email:email, password:mật khẩu người dùng, tên đầu tiên:req.body.firstname, tên cuối cùng:req.body.lastname}; User.create (data) .then (function (newUser, đã tạo) {if (! NewUser) {return done (null, false);} if (newUser) {return done (null, newUser);}}); }}); }));} 

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

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

 // tải các chiến lược hộ chiếurequire ('./ app / config / passport / passport.js') (passport, models.user); 

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

 var express =demand ('express') var app =express () var passport =request ('passport') var session =demand ('express-session') var bodyParser =request ('body-parser') var env =demand ('dotenv'). load () var exphbs =demand ('express-handlebars') // Đối với BodyParserapp.use (bodyParser.urlencoded ({extension:true})); app.use (bodyParser.json ( )); // Dành cho Passportapp.use (session ({secret:'keyboard cat', resave:true, saveUninitialized:true})); // phiên secretapp.use (passport.initialize ()); app.use (passport.session ()); // phiên đăng nhập liên tục // Dành cho Handlebarsapp.set ('views', './app/views')app.engine('hbs', exphbs ({extname:'.hbs'})); app.set (' view engine ',' .hbs '); app.get (' / ', function (req, res) {res.send (' Chào mừng bạn đến với Passport with Sequelize ');}); // Modelsvar models =request (". / app / models "); // Routesvar authRoute =demand ('./ app / lines / auth.js') (app); // load passport strategyrequire ('./ app / config / passport / passport.js') (passport, models.user); // Sync Databasemodels.sequelize.sync (). then (function () {console.log ('Đẹp! Cơ sở dữ liệu trông ổn')}). catch (function (err) {console.log (err, "Đã xảy ra lỗi với Bản cập nhật cơ sở dữ liệu!")}); app.listen (5000, function (err) {if (! err) console.log ("Trang web đang hoạt động"); else console.log (err )}); 

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

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

Đầu tiên, chúng tôi truy cập app / lines / auth.js và thêm một lộ trình để đăng ký như thế này.

 app.post ('/ signup', passport.authenticate ('local-signup', {successRedirect:'/ dashboard', failRedirect:'/ signup'})); 

Vì chúng tôi cần hộ chiếu, chúng tôi cần chuyển nó sang phương thức này. Chúng tôi có thể nhập hộ chiếu trong tập lệnh này hoặc chuyển nó từ server.js. Hãy làm phần sau.

Sửa đổi hàm được xuất trong tệp này app / route / auth.js để có hộ chiếu như một tham số. Mã trong app / route / auth.js sẽ trông như thế này sau khi bạn sửa đổi.

 var authController =demand ('../ controllers / authcontroller.js'); module.exports =function (app, passport) {app.get ('/ signup', authController.signup); app.get ('/ signin', authController.signin); app.post ('/ signup', passport.authenticate ('local-signup', {successRedirect:'/ dashboard', failRedirect:'/ signup'}));} 

Sau đó, trong server.js , chúng tôi sửa đổi các tuyến nhập và thêm hộ chiếu 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à cố gắng đăng ký.

Khi bạn cố gắng đăng ký, bạn sẽ gặp lỗi " Không thể tuần tự hóa người dùng vào phiên ". Điều này là do hộ chiếu phải lưu ID người dùng trong phiên và sử dụng ID này để quản lý việc truy xuất thông tin chi tiết về người dùng khi cần thiết.

Để 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 hộ chiếu trong app / config / passport / passport.js của chúng tôi tệp.

Đầu tiên, chúng tôi thêm chức năng tuần tự hóa. Trong chức năng này, chúng tôi sẽ lưu id người dùng đến phiên.

Để thực hiện việc này, chúng tôi thêm các dòng sau vào bên dưới phần khởi chạy chiến lược cục bộ.

 //serializepassport.serializeUser( function(user, done) {done (null, user.id);}); 

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

 // deserialize user passport.deserializeUser (function (id, done) {User.findById (id) .then (function (user) {if (user) {done (null, user.get ());} else {done (user.errors, null);}});}); 

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

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

 node server.js 

Và cố gắng đăng ký. Nhanh lên nếu bạn nhận được thông báo "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 / dashboard trong phương thức passport.authenticate trong route / auth.js .

Bây giờ chúng ta hãy tiếp tục và thêm tuyến đường đó. Sau đó, thêm phần mềm trung gian để đảm bảo trang chỉ có thể được truy cập khi người dùng đăng nhập vào phiên.

Trong ứng dụng / chế độ xem của chúng tôi thư mục, chúng tôi tạo một tệp mới có tên là dashboard.hbs và thêm mã HTML sau vào đó.

     Hộ chiếu có Sequelize    

Trang tổng quan

Hurray! bạn đã đăng nhập.

Trong route / auth.js , chúng tôi thêm dòng này vào bên trong module.exports khối:

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

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

 export.dashboard =function (req, res) {res.render ('dashboard');} 

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

 var export =module.exports ={} export.signup =function (req, res) {res.render ('signup');} export.signin =function (req, res) {res.render ('signin ');} export.dashboard =function (req, res) {res.render (' dashboard ');} 

Bây giờ, hãy chạy lại ứng dụng và cố gắng đăng ký bằng một đị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 / dashboard tuyến đường.

Nhưng / bảng điều khiển không phải là một tuyến đường được bảo vệ, có nghĩa là ngay cả khi người dùng không đăng nhập, họ vẫn 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 / đăng xuất định tuyến để đăng xuất người dùng, sau đó bảo vệ tuyến và kiểm tra những gì chúng tôi đã thực hiện.

Hãy làm điều này:

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

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

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

 export.logout =function (req, res) {req.session.destroy (function (err) {res.redirect ('/');}); } 

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 đó, 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ó khá dễ tiếp cận. Hãy thêm một phần mềm trung gian tùy chỉnh để bảo vệ tuyến đường đó.

Để thực hiện việc này, chúng tôi mở app / route / auth.js and thêm chức năng này trong module.exports , bên dưới tất cả các dòng mã khác.

 function isLoggedIn (req, res, next) {if (req.isAuthenticated ()) return next (); res.redirect ('/ signin');} 

Sau đó, chúng tôi sửa đổi trình xử lý tuyến đường của bảng điều khiển để 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à cố gắng truy cập trang tổng quan và bạn chưa đăng nhập, bạn sẽ được chuyển hướng đến trang đăng nhập.

Chà! Đã đến lúc thực hiện phần cuối cùng:đăng nhập.

Đầu tiên, chúng tôi sẽ thêm một chiến lược cục bộ mới để đăng nhập vào app / config / passport / passport.js .

 // LOCAL SIGNINpassport.use ('local-signin', new LocalStrategy ({// theo mặc định, chiến lược cục bộ sử dụng tên người dùng và mật khẩu, chúng tôi sẽ ghi đè bằng tên người dùng emailField:'email', passwordField:'password', passReqToCallback :true // cho phép chúng tôi chuyển lại toàn bộ yêu cầu tới callback}, function (req, email, password, done) {var User =user; var isValidPassword =function (userpass, password) {return bCrypt.compareSync (password, userpass);} User.findOne ({where:{email:email}}). then (function (user) {if (! user) {return done (null, false, {message:'Email không tồn tại'});} if (! isValidPassword (user.password, password)) {return done (null, false, {message:'Incorrect password.'});} var userinfo =user. mắc phải(); hoàn tất (null, userinfo); }). catch (function (err) {console.log ("Error:", err); return done (null, false, {message:'Đã xảy ra lỗi với Đăng nhập của bạn'});}); })); 

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

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

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

 app.post ('/ signin', passport.authenticate ('local-signin', {successRedirect:'/ dashboard', failRedirect:'/ signin'})); 

Các tuyến đường / auth.js của bạn sẽ trông giống như thế này khi bạn hoàn tất.

 var authController =demand ('../ controllers / authcontroller.js'); module.exports =function (app, passport) {app.get ('/ signup', authController.signup); app.get ('/ signin', authController.signin); app.post ('/ signup', passport.authenticate ('local-signup', {successRedirect:'/ dashboard', failRedirect:'/ signup'})); app.get ('/ dashboard', isLoggedIn, authController.dashboard); app.get ('/ logout', authController.logout); app.post ('/ signin', passport.authenticate ('local-signin', {successRedirect:'/ dashboard', failRedirect:'/ signin'})); function isLoggedIn (req, res, next) {if (req.isAuthenticated ()) return next (); res.redirect ('/ đăng nhập'); }} 

Bây giờ, hãy chạy ứng dụng và cố gắng đă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 hướng đến http :// localhost:5000 / dashboard /.

Xin chúc mừng nếu bạn đã đến phần cuối của hướng dẫn này! Chúng tôi đã sử dụng thành công Sequelize và Passport với cơ sở dữ liệu MySQL.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để cài đặt trình điều khiển pdo trong php docker image?

  2. cột cập nhật mysql với giá trị từ bảng khác

  3. Hàm MySQL COS () - Trả về Cosine của một số trong MySQL

  4. Loại bỏ MySQL Split-Brain trong Cơ sở dữ liệu đa đám mây

  5. Tự động tải dữ liệu trên cuộn div bằng php, mysql, jquery và ajax