Статьи

Локальная аутентификация с использованием паспорта в Node.js

В Аутентификации Passport для Приложений Node.js мы говорили об аутентификации, используя Passport, поскольку это относится к социальному входу в систему (Google, Facebook, GitHub и т. Д.). В этой статье мы увидим, как мы можем использовать Passport для локальной аутентификации с помощью MongoDB.

Весь код из этой статьи доступен для скачивания на GitHub .

Предпосылки

  • Node.js — скачайте и установите Node.js.
  • MongoDB — Загрузите и установите Сервер сообщества MongoDB. Следуйте инструкциям для вашей ОС. Обратите внимание, что если вы используете Ubuntu, это руководство поможет вам запустить Mongo.

Создание проекта

Как только все необходимое программное обеспечение настроено, мы можем начать.

Мы начнем с создания папки для нашего приложения и последующего доступа к этой папке в терминале:

mkdir AuthApp cd AuthApp 

Чтобы создать приложение узла, мы будем использовать следующую команду:

 npm init 

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

HTML

Далее нам понадобится форма с username и password а также кнопка « Отправить» . Давайте сделаем это! Создайте файл с именем auth.html в корневой папке вашего приложения со следующим содержимым:

 <html> <body> <form action="/" method="post"> <div> <label>Username:</label> <input type="text" name="username" /> <br/> </div> <div> <label>Password:</label> <input type="password" name="password" /> </div> <div> <input type="submit" value="Submit" /> </div> </form> </body> </html> 

Это будет хорошо.

Настройка Экспресс

Теперь нам нужно установить Express , конечно. Перейдите в терминал и напишите эту команду:

 npm install express --save 

Нам также необходимо установить промежуточное программное обеспечение body-parser, которое используется для анализа тела запроса, которое Passport использует для аутентификации пользователя.

Давайте сделаем это. Запустите следующую команду:

 npm install body-parser --save 

Когда это будет сделано, создайте файл index.js в корневой папке вашего приложения и добавьте в него следующее содержимое:

 /* EXPRESS SETUP */ const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: true })); app.get('/', (req, res) => res.sendFile('auth.html', { root : __dirname})); const port = process.env.PORT || 3000; app.listen(port , () => console.log('App listening on port ' + port)); 

Мы делаем почти так же, как в предыдущем уроке. Сначала мы требуем Express и создаем наше приложение Express, вызывая [express()](http://expressjs.com/en/api.html#express) . Следующая строка — единственная разница с нашей предыдущей настройкой Express. На этот раз нам понадобится промежуточное программное обеспечение body-parser для корректной работы аутентификации. Затем мы объявляем маршрут для домашней страницы нашего приложения. Там мы отправляем созданный нами HTML-файл клиенту, который обращается к этому маршруту. Затем мы используем process.env.PORT чтобы установить для порта переменную окружения, если она существует. В противном случае мы будем использовать значение по умолчанию 3000 , то есть порт, который мы будем использовать локально. Это дает вам достаточно гибкости, чтобы перейти от разработки непосредственно к производственной среде, где порт может быть установлен поставщиком услуг, например, Heroku . Прямо ниже мы вызвали [app.listen()](http://expressjs.com/en/api.html#app.listen) с установленной нами переменной порта и простым журналом, чтобы мы знали, что все работает нормально и на каком порту приложение прослушивает.

Это все для настройки Express. Теперь нам нужно настроить Passport, как мы это делали в прошлый раз. Я покажу вам, как это сделать, если вы не читали предыдущий урок.

Настройка паспорта

Сначала мы устанавливаем паспорт с помощью следующей команды:

 npm install passport --save 

Затем добавьте следующие строки внизу вашего файла index.js :

 /* PASSPORT SETUP */ const passport = require('passport'); app.use(passport.initialize()); app.use(passport.session()); app.get('/success', (req, res) => res.send("Welcome "+req.query.username+"!!")); app.get('/error', (req, res) => res.send("error logging in")); passport.serializeUser(function(user, cb) { cb(null, user.id); }); passport.deserializeUser(function(id, cb) { User.findById(id, function(err, user) { cb(err, user); }); }); 

Здесь мы требуем паспорт и инициализируем его вместе с промежуточным программным обеспечением для аутентификации сеанса непосредственно в нашем приложении Express. Затем мы устанавливаем маршруты '/success' и '/error' которые будут отображать сообщение о том, как прошла аутентификация. Если это удастся, мы покажем параметр username , который мы передадим в запрос. Мы используем тот же синтаксис для нашего последнего маршрута, только на этот раз вместо использования [res.SendFile()](http://expressjs.com/en/api.html#res.sendFile) мы используем [res.send()](http://expressjs.com/en/api.html#res.send) , который отображает данную строку как text/html в браузере. Затем мы используем обратные вызовы serializeUser и deserializeUser . Первый будет вызван при аутентификации, и его задача состоит в том, чтобы сериализовать пользовательский экземпляр с информацией, которую мы ему передаем (в данном случае — с идентификатором пользователя), и сохранить его в сеансе с помощью файла cookie. Второй будет вызываться при каждом последующем запросе на десериализацию экземпляра, предоставляя ему уникальный идентификатор cookie в качестве «учетных данных». Вы можете прочитать больше об этом в документации Passprot .

В качестве примечания, это очень простое наше приложение-пример будет прекрасно работать без deserializeUser , но оно убивает цель сохранения сеанса, что, безусловно, то, что вам нужно в каждом приложении, требующем входа в систему.

Создание хранилища данных MongoDB

Поскольку мы предполагаем, что вы уже установили Mongo, вы сможете запустить сервер mongod с помощью следующей команды:

 sudo mongod 

Из другого терминала запустите оболочку Mongo:

 mongo 

Внутри оболочки введите следующие команды:

 use MyDatabase; db.userInfo.insert({'username':'admin','password':'admin'}); 

Первая команда создает хранилище данных с именем MyDatabase . Вторая команда создает коллекцию с именем userInfo и вставляет запись. Давайте вставим еще несколько записей:

 db.userInfo.insert({'username':'jay','password':'jay'}); db.userInfo.insert({'username':'roy','password':'password'}); 

Извлечение сохраненных данных

Мы можем просмотреть только что добавленные данные, используя следующую команду:

 db.userInfo.find(); 

Полученный результат показан ниже:

 { "_id" : ObjectId("5321cd6dbb5b0e6e72d75c80"), "username" : "admin", "password" : "admin" } { "_id" : ObjectId("5321d3f8bb5b0e6e72d75c81"), "username" : "jay", "password" : "jay" } { "_id" : ObjectId("5321d406bb5b0e6e72d75c82"), "username" : "roy", "password" : "password" } 

Мы также можем найти конкретное имя пользователя и пароль:

 db.userInfo.findOne({'username':'admin','password':'admin'}) 

Эта команда вернет только пользователя с правами администратора.

Соединение Монго с Узлом с Мангустом

Теперь, когда у нас есть база данных с записями, нам нужен способ связи с ней из нашего приложения. Мы будем использовать Mongoose для достижения этой цели. Почему бы нам просто не использовать простой монго? Ну, как разработчики Mongoose любят говорить на своем сайте:

Написание MongoDB для валидации, приведения и бизнес-логики является непростой задачей.

Mongoose просто сделает нашу жизнь проще, а наш код — более элегантным.

Давайте продолжим и установим его с помощью следующей команды:

 npm install mongoose --save 

Теперь нам нужно настроить Mongoose. Вы знаете, что делать: добавьте следующий код в index.js файла index.js :

 /* MONGOOSE SETUP */ const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/MyDatabase'); const Schema = mongoose.Schema; const UserDetail = new Schema({ username: String, password: String }); const UserDetails = mongoose.model('userInfo', UserDetail, 'userInfo'); 

Здесь мы требуем пакет mongoose . Затем мы подключаемся к нашей базе данных с помощью mongoose.connect и указываем путь к нашей базе данных. Затем мы используем схему для определения нашей структуры данных. В этом случае мы создаем схему UserDetail с полями username и password . После этого мы создаем модель из этой схемы. Первый параметр — это имя коллекции в базе данных. Второй — ссылка на нашу Schema , а третий — имя, которое мы присваиваем коллекции внутри Mongoose.

Это все для настройки Mongoose. Теперь мы можем перейти к реализации нашей Strategy .

Реализация локальной аутентификации

Пришло время настроить нашу стратегию аутентификации, используя passport-local . Давайте продолжим и установим его. Запустите следующую команду:

 npm install passport-local --save 

Наконец, мы подошли к последней части кода! Добавьте его в index.js файла index.js :

 /* PASSPORT LOCAL AUTHENTICATION */ const LocalStrategy = require('passport-local').Strategy; passport.use(new LocalStrategy( function(username, password, done) { UserDetails.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } if (user.password != password) { return done(null, false); } return done(null, user); }); } )); app.post('/', passport.authenticate('local', { failureRedirect: '/error' }), function(req, res) { res.redirect('/success?username='+req.user.username); }); 

Давайте пройдем через это. Во-первых, нам нужна passport-local Strategy . Затем мы сообщаем Passport use экземпляр LocalStrategy нам необходим. Там мы просто используем ту же команду, что и в оболочке Mongo, чтобы найти запись, основанную на имени пользователя. Если запись найдена и пароль совпадает, приведенный выше код возвращает объект user . В противном случае возвращается false .

Ниже о реализации стратегии находится наша post с методом [passport.authenticate](http://www.passportjs.org/docs/authenticate/) который пытается аутентифицироваться с помощью данной стратегии по ее первому параметру, в данном случае 'local' . Он перенаправит нас на '/error' если не получится. В противном случае он перенаправит нас на маршрут '/success' , отправив имя пользователя в качестве параметра. Вот так мы получаем имя пользователя для отображения в строке req.query.username мы видели ранее.

Это все, что нам нужно для работы приложения. Были сделаны!

Перезапустите сервер Node и укажите в браузере http://localhost:3000/ и попробуйте войти с «admin» в качестве имени пользователя и «admin» в качестве пароля. Если все идет хорошо, вы должны увидеть сообщение «Добро пожаловать, администратор !!» в браузере.

Вывод

В этой статье мы узнали, как реализовать локальную аутентификацию с использованием Passport в приложении Node.js. В процессе мы также узнали, как подключиться к MongoDB с помощью Mongoose.

Мы только добавили необходимые модули для работы этого приложения — ни больше, ни меньше. Для производственного приложения вам нужно будет добавить другое промежуточное ПО и разделить ваш код на модули. Вы можете принять это как задачу создать чистую и масштабируемую среду и превратить ее во что-то полезное! Пожалуйста, поделитесь этим со мной, если вы делаете. Увидимся на следующем!