Простая система аутентификации Nodejs с использованием паспорта является ведущей темой сегодня. В этом руководстве вы узнаете, как использовать паспорт.js для аутентификации пользователя. Итак, что такое Passport.js ? Passport.js — это простое и ненавязчивое ПО промежуточного слоя аутентификации на Node.js для Node.js . Passport.js можно использовать в любом веб-приложении на основе Express.js. Поэтому мы будем использовать Node.js в качестве платформы, Express в качестве веб-фреймворка, MongoDB в качестве базы данных и Passport.js в качестве библиотеки промежуточного программного обеспечения для веб-приложения.
- Система аутентификации Nodejs с использованием Passport
- Шаг 1. Установите зависимости NPM
- Шаг 2. Создайте файл server.js и запустите сервер узла.
- Шаг 3. Создание необходимых каталогов
- Шаг 4: Создайте страницы входа и регистрации
- Шаг 5. Проверка на стороне сервера.
- Шаг 6: Сохраните пользователя в базе данных.
- Шаг 7. Напишите логику для входа в систему.
- Код Github
Система аутентификации Nodejs с использованием Passport
Мы создадим систему аутентификации шаг за шагом, и это будет долгая поездка. Так что следите за обновлениями.
Шаг 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
//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 создайте следующие два файла.
- index.ejs
- users. ejs
Кроме того, нам нужно создать еще одну папку внутри каталога views под названием partials. Эта папка содержит файлы заголовка, нижнего колонтитула и боковой панели .
Сейчас я просто создаю файл header.ejs .
Затем создайте в корне один каталог с именем routes и внутри него создайте два файла .
- index.js
- 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 с использованием паспорта окончено.