Простая система аутентификации Nodejs с использованием паспорта

Простая система аутентификации Nodejs с использованием паспорта является ведущей темой сегодня. В этом руководстве вы узнаете, как использовать паспорт.js для аутентификации пользователя. Итак, что такое Passport.js ? Passport.js — это простое и ненавязчивое ПО промежуточного слоя аутентификации на Node.js для Node.js . Passport.js можно использовать в любом веб-приложении на основе Express.js. Поэтому мы будем использовать Node.js в качестве платформы, Express в качестве веб-фреймворка, MongoDB в качестве базы данных и Passport.js в качестве библиотеки промежуточного программного обеспечения для веб-приложения.

Система аутентификации Nodejs с использованием Passport

Мы создадим систему аутентификации шаг за шагом, и это будет долгая поездка. Так что следите за обновлениями.

Примечание: Если на каком-либо этапе вы обнаружите какие-либо ошибки, перейдите в мой код Github. Ссылка находится внизу сообщения.

Шаг 1. Установите зависимости NPM

Сначала нам нужно установить все необходимые зависимости для этого проекта. Итак, создайте один файл с именем package.json. Мы можем создать этот файл с помощью терминала. Перейдите в корень проекта и нажмите следующую команду.

 npm init 

Итак, ответьте на все вопросы и он создаст файл.

Затем вы напишете некоторые из его зависимостей, как показано ниже.

 {"name": "expresslogin", "version": "1.0.0", "description": "", "main": "index.js", "scripts": {"test": "  echo  "Ошибка: не указан тест " && exit 1 "," start ":" nodemon ./server.js --exec babel-node -e js "}," dependencies ": {" bcryptjs ":" * "  , "body-parser": "*", "connect-flash": "*", "cookie-parser": "*", "express": "*", "ejs": "*", "express-  messages ":" * "," express-session ":" * "," express-validator ":" * "," mongodb ":" * "," mongoose ":" * "," nodemon ":" * "  , "паспорт": "*", "паспорт-http": "*", "паспорт-локальный": "*"}, "devDependencies": {"babel-cli": "^ 6.26.0", "babel  -preset-es2015 ":" ^ 6.24.1 "," babel-preset-stage-0 ":" ^ 6.24.1 "}," author ":" KRUNAL LATHIYA "," license ":" ISC "} 

Здесь мне нужно установить depen зависимости и зависимости от разработчиков. Скопируйте эти два объекта dependencies и dev dependencies в свой проект, а затем нажмите следующую команду.

 npm install 

Также мы установили babel- cli , потому что он может преобразовать наш код ES6 в ES5 и запустить код Node.js на сервере. Создайте еще один файл с именем

 {"presets": ["es2015", "stage-0"]} 

Шаг 2. Создайте файл server.js и запустите сервер узла.

В корневом каталоге создайте один файл с именем server.js.

 import express from 'express'; import path from 'path'; import cookeParser from 'cookie-parser'; import bodyParser from 'body-parser'; import ejs from 'ejs  '; импортировать expressValidator из' экспресс-валидатора '; импортировать flash из' connect-flash '; импортировать сеанс из' экспресс-сеанса '; импортировать паспорт из' паспорта '; const LocalStrategy = require (' паспорт-локальный '). Стратегия;  импортировать мангуста из 'мангуста'; const app = express (); const PORT = 3000; mongoose.Promise = global.Promise; mongoose.connect ('mongodb://localhost/паспорт', {useMongoClient: true}); приложение.  get ('/', (req, res) => {res.send ('Узел и экспресс работают правильно');}); app.listen (ПОРТ, функция () {console.log ('Сервер работает на  ', PORT);}); 

Теперь, перейдите в терминал и нажмите следующую команду.

 npm start 

Он запустит сервер, и на порту 3000 будет запущено наше приложение. Итак, перейдите на http://localhost: 3000

« Node and express работают правильно ».
Затем нам нужно настроить механизм просмотра и промежуточное ПО для нашего приложения.
//app.jsapp.set ('views'  , path.join (__ dirname, 'views')); app.set ('view engine', 'ejs'); app.use (bodyParser.json ()); app.use (bodyParser.urlencoded ({extended: true  })); app.use (cookeParser ()); app.use (паспорт.initialize ()); app.use (паспорт.сессия ()); app.use (session ({secret: 'keyboard cat', повторно сохранить  : false, saveUninitialized: true,})); app.use (expressValidator ()); app.use (flash ()); app.use (function (req, res, next) {res.locals.success_message = req.  flash ('success_message'); res.locals.error_message = req.flash ('error_message'); res.locals.error = req.flash ('error'); next ();}); 

Мы установили механизм просмотра на ejs и установили экспресс-валидатор , sessions и промежуточное ПО для flash сообщений.

Кроме того, мы инициализировали Библиотека паспорт .

Шаг 3. Создание необходимых каталогов

В корневой папке создайте один каталог с именем views и внутри этого каталога создайте один каталог с именем

Внутри каталога pages создайте следующие два файла.

  1. index.ejs
  2. users. ejs

Кроме того, нам нужно создать еще одну папку внутри каталога views под названием partials. Эта папка содержит файлы заголовка, нижнего колонтитула и боковой панели .

Сейчас я просто создаю файл header.ejs .

   

Затем создайте в корне один каталог с именем routes и внутри него создайте два файла .

  1. index.js
  2. users.js

Напишите следующий код внутри index.js

//routes> index.jsimport express из 'express'; let router = express.Router (); router.get ('/',  function (req, res) {res.render ('index');}); экспорт маршрутизатора по умолчанию; 

Кроме того, напишите следующий код внутри users.js файл.

//маршрутизирует> пользователей.  jsimport express из 'express'; let router = express.Router (); router.get ('/', function (req, res) {res.render ('pages/users');}); router.get (' /register ', function (req, res) {res.render (' pages/register ');}); экспортировать маршрутизатор по умолчанию; 

Теперь импортируйте эти файлы в server.js . Я показываю окончательный код файла server.js .

//server.jsimport express from 'express'; import path from 'path'; import cookeParser from '  cookie-parser '; импортировать bodyParser из' body-parser '; импортировать ejs из' ejs '; импортировать expressValidator из' express-validator '; импортировать flash из' connect-flash '; импортировать сеанс из' express-session '; импортировать паспорт  from 'Паспорт'; const LocalStrategy = require ('паспорт-локальный'). Стратегия; импортировать мангуста из 'мангуста'; импортировать индекс из './routes/index'; импортировать пользователей из './routes/users';mongoose.  Promise = global.Promise; mongoose.connect ('mongodb://localhost/CRMDB', {useMongoClient: true}); let db = mongoose.connect; const app = express (); const PORT = 3000; app.use (  express.static (__ dirname + '/public'));app.set('views', path.join (__ dirname, 'views')); app.set ('механизм просмотра', 'ejs'); app.use  (bodyParser.json ()); app.use (bodyParser.urlencoded ({extended: false})); app.use (cookeParser ()); app.use (session ({secret: 'keyboard cat', resave: fals  e, saveUninitialized: true,})); приложение. использование (паспорт.initialize ()); приложение.использование (паспорт.сессия ()); приложение.усе (экспрессВалидатор ()); приложение.использование (флэш ()); приложение.использование (функция (req, res, next)  {res.locals.success_message = req.flash ('success_message'); res.locals.error_message = req.flash ('error_message'); res.locals.error = req.flash ('error'); res.locals.  user = req.user || null; next ();}); app.use ('/', index); app.use ('/users', users); app.listen (PORT, function () {console  .log ('Сервер работает', ПОРТ);}); 

Шаг 4: Создайте страницы входа и регистрации

Во-первых, нам нужно включить фреймворк начальной загрузки css для разработки веб-страниц.

Теперь включите часть header.ejs в файл index.ejs .

     INDEX     
Домашняя страница

Теперь создайте register.ejs trong> внутри папки views >> pages .

     Зарегистрироваться     
Зарегистрировать пользователя

Шаг 5. Проверка на стороне сервера.

В файл routes >> users.js вставьте следующий код .

//users.jsrouter. post ('/register', function (req, res) {let name = req.body.name; let email = req.body.email; let password = req.body.password; let cfm_pwd = req.body.cfm_pwd;  req.checkBody ('name', 'Name is required'). notEmpty (); req.checkBody ('email', 'Email is required'). notEmpty (); req.checkBody ('email', 'Пожалуйста, введите  действительный адрес электронной почты '). isEmail (); req.checkBody (' пароль ',' Требуется пароль '). notEmpty (); req.checkBody (' cfm_pwd ',' Подтверждение пароля требуется '). notEmpty (); req.  checkBody ('cfm_pwd', 'Подтверждение пароля должно совпадать с паролем'). equals ('req.body.password'); let errors = req.validationErrors (); if (errors) {res.render ('pages/register'  , {errors: errors});} else {console.log ('Success');}}); 

Теперь мы включили проверку на стороне сервера, поэтому нам нужно отобразить ошибки , поэтому мы поместили сообщения об ошибках и успешном выполнении в файл header.ejs .

  

Шаг 6: Сохраните пользователя в базе данных.

Создайте одну папку в корне проекта с именем models и внутри создайте один файл с именем User .js

//User.jsimport mongoose from 'mongoose'; import bcrypt from 'bcryptjs'; let UserSchema = mongoose.Schema ({name: {type: String, index:  true}, электронная почта: {type: String}, пароль: {type: String}}); export const User = mongoose.model ('User', UserSchema); export const createUser = (newUser, callback) => {bcrypt.  genSalt (10, функция (ошибка, соль) {bcrypt.hash (newUser.password, salt, function (err, hash) {newUser.password = hash;  newUser.save (обратный вызов);  });  });} 

Теперь импортируйте эту модель пользователя в файл routes >> users.js .
Итак, окончательный файл выглядит так.

 import express из 'express'; import {User, createUser} из '../models/User';let router = express.Router (); router.get ('/', function  (req, res) {res.render ('страницы/пользователи');}); router.get ('/register', function (req, res) {res.render ('pages/register');});  router.post ('/register', function (req, res) {let name = req.body.name; let email = req.body.email; let password = req.body.password; let cfm_pwd = req.body.  cfm_pwd; req.checkBody ('name', 'Name is required'). notEmpty (); req.checkBody ('email', 'Email is required'). notEmpty (); req. checkBody ('электронная почта', 'Пожалуйста, введите действительный адрес электронной почты'). isEmail ();  req.checkBody ('пароль', 'Требуется пароль'). notEmpty ();  req.checkBody ('cfm_pwd', 'Требуется подтверждение пароля'). notEmpty ();  req.checkBody ('cfm_pwd', 'Подтверждение пароля должно совпадать с паролем'). equals (пароль);  let errors = req.validationErrors ();  если (ошибки) {res.render ('страницы/регистр', {ошибки: ошибки});  } else {let user = new User ({имя: имя, электронная почта: электронная почта, пароль: пароль});  createUser (пользователь, функция (ошибка, пользователь) {если (ошибка) бросить ошибку; иначе console.log (пользователь);});  req.flash ('success_message', 'Вы зарегистрировались, пожалуйста, войдите в систему');  res.redirect ('логин');  }}); router.get ('/login', function (req, res) {res.render ('pages/login');}); router.post ('/login', function (req, res) {  res.render ('pages/login');}); экспорт роутера по умолчанию; 

Кроме того, нам нужно сделать страницу входа в views >> pages folder.

     Пользователь входа     
Пользователь, вошедший в систему

Также измените навигацию header .

   

Если все в порядке, вы можете увидеть, что пользователь был создан, сохранен в базе данных MongoDB , а также вы можете увидеть пользователя в консоли.

Шаг 7. Напишите логику для входа в систему.

Следующим шагом будет написание Passport Authentication промежуточного программного обеспечения внутри post route для входа и входа.

//routes >> users.jsrouter.post (' /login ', паспорт.authenticate (' local ', {failureRedirect:'/users/login ', failureFlash: true}), function (req, res) {req.flash (' success_message ',' Вы вошли в систему!  ! '); res.redirect ('/');}); 

Теперь, нам нужно использовать стратегию местного паспорта. Поэтому напишите код в файле users.js .

//routes >> users.jspassport.use (new LocalStrategy ({usernameField: 'email',  passwordField: 'пароль', passReqToCallback: true}, функция (req, email, password, done) {getUserByEmail (email, function (err, user) {if (err) {return done (err);} if (! user)  {return done (null, false, req.flash ('error_message', 'Email is found'));} comparePassword (пароль, user.password, function (err, isMatch) {if (err) {return done (err  );} if (isMatch) {return done (null, user, req.flash ('success_message', 'Вы успешно вошли в систему !!'));} else {return done (null, false, req.flash ('  error_message ',' Неверный пароль '));}});});})); Passport.serializeUser (function (user, done) {done (null, user._id);}); Passport.deserializeUser (function (  id, done) {getUserById (id, function (err, user) {done (err, user);});}); 

Теперь весь файл будет выглядеть так.

//users.jsimport express from 'expre  ss '; импортировать {User, createUser, comparePassword, getUserByEmail, getUserById} из' ../models/User '; импортировать паспорт из' паспорта '; let LocalStrategy = require (' паспорт-локальный '). Стратегия; let router = express  .Router (); router.get ('/', function (req, res) {res.render ('pages/users');}); router.get ('/register', function (req, res) {  res.render ('pages/register');}); router.post ('/register', function (req, res) {let name = req.body.name; let email = req.body.email; let password  = req.body.password; пусть cfm_pwd = req.body.cfm_pwd; req. checkBody ('name', 'Name is required'). notEmpty (); req.checkBody ('email', 'Email is required'). notEmpty (); req.checkBody ('email', 'Пожалуйста, введите действительный адрес электронной почты  ') .isEmail (); req.checkBody (' пароль ',' Требуется пароль '). notEmpty (); req.checkBody (' cfm_pwd ',' Подтверждение пароля требуется '). notEmpty (); req.checkBody (  'cfm_pwd', 'Подтверждение пароля должно совпадать с паролем'). equals (пароль); let errors = req.validationErrors (); if (errors) {res.render ('pages/register', {errors: errors});  } else {let user = new User ({name: name, email: email, password: password}); createUser (user, function (err, user) {if (err) throw err; else console.log (user);  }); req.flash ('success_message', 'Вы зарегистрировались, теперь, пожалуйста, войдите'); res.redirect ('login');}}); router.get ('/login', function (req, res)  {res.render ('pages/login');}); Passport.use (new LocalStrategy ({usernameField: 'email', passwordField: 'password', passReqToCallback: true}, function (req, email, password, done)  {getUserByEmail (электронная почта, функция (err, user) {if (err) {retu  rn сделано (ошибка);  } if (! user) {return done (null, false, req.flash ('error_message', 'Электронная почта не найдена'));  } comparePassword (пароль, user.password, function (err, isMatch) {if (err) {return done (err);} if (isMatch) {return done (null, user, req.flash ('success_message', 'You  успешно вошли в систему !! '));} else {return done (null, false, req.flash (' error_message ',' Incorrect Password '));}});  });  })); паспорт.serializeUser (function (user, done) {done (null, user._id);}); Passport.deserializeUser (function (id, done) {getUserById (id, function (err, user) {done  (err, user);});}); router.post ('/login', паспорт.authenticate ('local', {failureRedirect: '/users/login', failureFlash: true}), function (req, res  ) {req.flash ('success_message', 'Вы вошли в систему !!'); res.redirect ('/');}); router.get ('/logout', function (req, res) {req  .logout (); req.flash ('success_message', 'Вы вышли из системы'); res.redirect ('/users/login');}); экспортировать маршрутизатор по умолчанию; 

Также , мы импортировали модели >> User.js.

//модели >> User.jsimport mongoose из 'mongoose'; импортируем bcrypt из 'bcryptjs';  импортировать паспорт из 'паспорта'; пусть UserSchema = mongoose.Schema ({name: {type: String, index: true}, email: {type: String}, password: {type: String}}); export const User = mongoose  .model ('Пользователь', UserSchema); export const createUser = (newUser, callback) => {bcrypt.genSalt (10, function  (ошибка, соль) {bcrypt.hash (newUser.password, salt, function (err, hash) {newUser.password = hash; newUser.save (callback);});  });} export const getUserByEmail = (email, callback) => {let Obj = {email: email} Пользователь. findOne (Obj, callback);} export const comparePassword = (пароль, хэш, обратный вызов) => {bcrypt.compare (пароль, хэш, функция (err, isMatch) {if (err) throw err; callback (null, isMatch)  ;});} export const getUserById = (id, callback) => {User.findById (id, callback);} 

Теперь нам нужно написать промежуточное ПО isLoggedIn в routes >> index.js file.

 import express from 'express'; let router = express.Router (); router.get ('/', isLoggedIn, function (  req, res) {res.render ('pages/index');}); function isLoggedIn (req, res, next) {if (req.isAuthenticated ()) {next ();} else {res.redirect (" /users/login »);  }} экспортировать маршрутизатор по умолчанию; 

Кроме того, наш файл header.ejs выглядит так.

  

Код Github

Если вы все еще обнаружите ошибку, перейдите к моему коду Github.

Fo rk Me On Github

Наше руководство по системе аутентификации Nodejs с использованием паспорта окончено.

Оцените статью
nanomode.ru
Добавить комментарий