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

Использование Passport вместе с Sequelize и MySQL

by
Difficulty:IntermediateLength:LongLanguages:

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Sequelize - это ORM, основанный на промисах. Он может использоваться с PostgreSQL, MySQL, MariaDB, SQLite и MSSQL. В этом уроке мы будем внедрять аутентификацию для пользователей веб-приложения. И мы будем использовать Passport, популярный мидлваре для идентификации для Node, вместе с Sequelize и MySQL для реализации регистрации пользователей и входа в систему.

Начинаем

Убедитесь, что на вашем компьютере установлено следующее:

  • Node
  • MySQL

Для этого урока мы будем использовать Node.js вместе с Express, поэтому мы установим все, что нам необходимо.

Шаг 1. Создание файла package.json

Создайте каталог для своего приложения. Внутри этого каталога запустите это из своего терминала или командной строки:

Эта команда инициализирует диспетчер зависимостей npm. Будет выведена серия подсказок, которые мы бегло рассмотрим.

  • Введите имя своего приложения без пробелов и нажмите Enter.
  • Нажмите «Ввод» для «версии».
  • В «описании» в этом уроке мы будем вводить «Использование Passport с Sequelize и MySQL» в качестве описания и нажмите «Ввод». А можете вообще оставить пустым.
  • Для «точки входа (index.js)» введите server.js и нажмите Enter.
  • Для «команды тестирования» нажмите «Ввод».
  • Для «git repository» вы можете ввести репозиторий git, где находится ваше приложение, если он есть, или просто нажмите Enter, чтобы оставить пустым.
  • Для «Ключевые слова» нажмите «Ввод».
  • Для «автора» нажмите «Ввод» или введите свое имя.
  • Для «лицензии» нажмите «Ввод».
  • Для «(s this okay )», это покажет вам, как будет выглядеть ваш package.json. Введите «Да» и нажмите «Ввод».

Шаг 2. Установка зависимостей

Основные зависимости этого руководства:

  • Express
  • Sequelize
  • MySQL
  • Passport
  • Passport Local Strategy
  • Body Parser
  • Express Session
  • Bcrypt Nodejs
  • Express Handlebars для отображений

Чтобы установить эти зависимости из своего терминала или командной строки, выполняйте следующие команды одну за другой.

Если вы используете Git для этого проекта:

В папке проекта создайте файл .gitignore.

Добавьте эту строку в файл .gitignore.

node_modules

Шаг 3. Настройка приложения

Теперь мы создаем файл сервера. Это будет основной файл, который вызывается вы вводите:

Это запускает приложение. Вы также можете запустить приложение, набрав node server.js.

Затем в нашей папке проекта мы создаем новый файл и называем этот файл server.js.

Внутри файла server.js мы вставляем следующее:

Первая строка присваивает модуль express переменной express. Затем мы инициализируем express и называем его переменной: app.

Затем мы подключаем приложение к порту 5000. Вы можете выбрать любой номер порта на своем компьютере.

Затем мы вызываем функцию маршрутизации express app.get(), чтобы ответить «Добро пожаловать в Passport с Sequelize», если будет выполнен GET запрос к адресу «/».

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

Если вы увидите текст «Добро пожаловать в Passport с Sequelize», когда вы откроете в своем браузере http://localhost:5000/, то мои поздравления! В противном случае убедитесь, что вы сделали все точно так, как написано выше.

Затем мы импортируем некоторые модули, которые нам будут нужны, например passport, express-session и body-parser.

После var app = express() мы добавим следующие строки:

В первых двух строках мы импортируем модуль passport и express-session, оба должны обрабатывать аутентификацию.

Затем мы импортируем модуль body-parser. Он извлекает всю часть тела входящего запроса и предоставляет его в формате, с которым легче работать. В нашем случае мы будем использовать формат JSON.

Чтобы наше приложение использовало синтаксический анализатор тела, мы добавляем эти строки ниже строк импорта:

Затем мы инициализируем passport, express session и passport session и добавляем их как middleware. Мы делаем это, добавляя эти строки после строки импорта bodyParser.

Теперь мы начнем работу с фактической аутентификацией.

Мы сделаем это в четыре этапа:

  • Настройка Sequelize с MySQL.
  • Создание модели user.
  • Настройка представления.
  • Напишем стратегию passport.

1. Настройка Sequelize с MySQL

Во-первых, мы создаем базу данных в MySQL. Дайте ей имя, которое вам нравится. В этом уроке давайте создадим базу данных с именем sequelize_passport в MySQL.

Затем мы настраиваем конфигурацию для обработки деталей БД.

Во-первых, давайте импортируем модуль dot-env для обработки переменных среды.

Запустите это в корневой папке проекта:

Затем мы импортируем его в файл основного сервера server.js, чуть ниже других импортов.

Затем мы создаем файл в нашей папке проекта и назовите его .env.

Следующий шаг является необязательным, если вы не используете Git:

Мы добавим файл .env в ваш файл .gitignore.

Ваш файл .gitignore должен выглядеть так:

После этого добавим наше окружение в файл .env, добавив эту строку:

NODE_ENV = 'development'

Затем мы создаем файл config.json, который будет использоваться Sequelize для управления различными оркужениями.

Первое, что нужно сделать, - создать папку с именем config в нашей папке проекта. Внутри этой папки мы создаем файл config.json. Этот файл следует игнорировать, если вы делаете пуш в репозиторий. Чтобы сделать это, добавьте следующий код в свой .gitignore:

config/config.json

Затем мы вставляем следующий код в наш файл config.json.

Не забудьте заменить значения в блоке разработки выше вашими учетными данными для базы данных.

Затем мы устанавливаем sequelize с помощью npm. Для этого запустите следующую команду в корневой папке проекта:

Теперь пришло время создать папку models.

Сначала мы создаем каталог с именем app в папке проекта.

В папке app мы создаем новую папку с именем models и создаем новый файл index.js в папке models.

Внутри файла index.js мы вставляем код ниже.

Этот файл используется для импорта всех моделей, которые мы размещаем в папке models, и экспортирует их.

Чтобы проверить, что все работает, добавим это в наш файл server.js.

Здесь мы импортируем модели, а затем вызываем функцию синхронизации Sequelize.

Запустите это, чтобы увидеть, все ли у нас работает:

Если вы получите сообщение "Site is live Nice! Database looks fine", то вы успешно настроили Sequelize.

Если нет, пожалуйста, внимательно прочитайте приведенные выше шаги и попытайтесь отладить проблему.

2. Создайте модель User

Следующее, что мы собираемся сделать, это создать модель пользователя, которая в основном представляет собой таблицу пользователей. Она будет содержать основную информацию пользователя.

В нашей папке models мы создаем файл и назовите его user.js. Полный путь для этого файла должен быть app/models/user.js.

Откройте файл user.js и добавьте следующий код:

Теперь запустите:

Вы должны увидеть знакомое уже сообщение "Site is live. Nice! Database looks fine." Это означает, что наши модели Sequelize были успешно синхронизированы, и если вы проверите свою базу данных, вы увидите таблицу пользователей с указанными столбцами.

3: Настройка отображений

Сначала давайте создадим представление для регистрации и подключим его.

Первое, что нужно сделать, это импортировать модуль express handlebars, который мы используем в этом учебнике для представлений.

Добавьте эту строку в наш основной файл server.js.

var exphbs = require('express-handlebars')

На этом этапе ваш блок импорта должен выглядеть так.

Затем добавим следующие строки в наш файл server.js.

Теперь, в нашей папке приложения, мы создаем три папки с именами viewscontrollers и routes.

В папке views мы создаем файл с именем signup.hbs и вставляем в него следующий код.

Затем в нашей папке controllers мы создаем новый файл и называем его authcontroller.js.

В этом файле мы вставляем следующий контроллер для маршрута регистрации, который мы сейчас создадим.

Затем мы создаем маршрут для регистрации. В папке маршрутов мы создаем новый файл с именем auth.js, а затем в этом файле мы импортируем контроллер auth и определим маршрут регистрации.

Теперь мы импортируем этот маршрут в наш server.js и передадим приложение в качестве аргумента.

На сервере после импорта моделей добавьте следующие строки:

Запустите это:

Теперь откройте в браузере http://localhost:5000/signup, и вы увидите форму регистрации.

Повторим шаги для формы входа. Как и прежде, мы создадим файл с именем signin.hbs в нашей папке представлений и вставим в него следующий HTML-код:

Затем добавьте контроллер для входа в приложение /controllers/authcontroller.js.

Затем в app/routes/auth.js мы добавляем маршрут для входа в систему следующим образом:

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

Теперь, когда вы запускаете:

И откроете в браузере http://localhost:5000/signin/, вы должны увидеть форму входа.

Окончательный и главный шаг - написать наши passport стратегии.

4. Пишем passport стратегию

В app/config мы создаем новую папку с именем passport.

Затем в нашей новой папке app/config/passport мы создаем новый файл и назовите его passport.js. Этот файл будет содержать наши паспортные стратегии.

В passport.js мы будем использовать модель пользователя и passport.

Во-первых, мы импортируем bcrypt, который необходим для защиты паролей.

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

Затем добавим блок module.exports следующим образом:

Внутри этого блока мы инициализируем локальную стратегию паспорта и модель пользователя, которая будет передана в качестве аргумента. Вот как мы это делаем:

Затем мы определяем нашу пользовательскую стратегию с нашим экземпляром LocalStrategy следующим образом:

Теперь мы объявили, какими полями запроса (req) являются наши usernameField  и passwordField (переменные паспорта).

Последняя переменная passReqToCallback позволяет нам передать весь запрос на обратный вызов, что особенно полезно для регистрации.

После последней запятой мы добавляем эту функцию обратного вызова.

В этой функции мы будем обрабатывать данные пользователя.

Во-первых, мы добавляем нашу функцию генерации пароля внутри функции обратного вызова.

Затем, используя пользовательскую модель Sequelize, которую мы инициализировали ранее как User, мы проверяем, существует ли пользователь, и нет то добавляем.

User.create() - это метод Sequelize для добавления новых записей в базу данных. Обратите внимание, что значения в объекте data берутся из объекта req.body, который содержит входные данные из нашей регистрационной формы.

Ваш passport.js должен выглядеть так:

Теперь мы импортируем стратегию в server.js.

Чтобы сделать это, мы добавляем эти строки ниже импорта маршрутов в server.js.

На данный момент ваш server.js должен выглядеть так:

Теперь мы фактически применим стратегию к нашему маршруту /signup.

Вот как мы это делаем:

Во-первых, мы переходим в app/routes/auth.js и добавляем маршрут для post запросов регистрации следующим образом образом.

Поскольку нам нужен паспорт, нам нужно передать его этому методу. Мы можем импортировать паспорт в этот скрипт или передать его с server.js. Давайте сделаем последнее.

Измените функцию, экспортированную в этом файле app/routes/auth.js, чтобы принимать паспорт в качестве параметра. Код в app/routes/auth.js должен выглядеть так после вашей модификации.

Затем в server.js мы изменяем импорт маршрутов и добавляем паспорт в качестве аргумента следующим образом:

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

Теперь перейдите на URL-адрес регистрации http://localhost:5000/signup/ и попробуйте зарегистрироваться.

Когда вы попытаетесь зарегистрироваться, вы получите сообщение об ошибке «Не удалось сериализовать пользователя в сеанс». Это связано с тем, что паспорт должен сохранять идентификатор пользователя в сеансе, и он использует его для управления поиском деталей пользователя по мере необходимости.

Чтобы решить эту проблему, мы собираемся реализовать как сериализацию, так и десериализацию паспорта в нашем файле app/config/passport/passport.js.

Сначала мы добавим функцию сериализации. В этой функции мы будем сохранять user id для сеанса.

Для этого добавим следующие строки ниже инициализации локальной стратегии.

Затем мы реализуем функцию десериализации. Добавьте функцию чуть ниже функции сериализации.

В описанной выше функции десериализации мы используем промис Sequelize findById для получения пользователя, и в случае успеха возвращается экземпляр модели Sequelize. Чтобы получить объект User из этого экземпляра, мы используем функцию Sequelize getter следующим образом: user.get().

Теперь запустите снова:

И попытайтесь зарегистрироваться. Ура, если у вас появилось сообщение «Can not GET / dashboard»! Это означает, что наша аутентификация прошла успешно. Помните, что мы перенаправили пользователя на /dashboard в нашем методе passport.authenticate в routes/auth.js.

Теперь давайте продолжим и добавим этот маршрут. Затем добавьте middleware, чтобы убедиться, что страница доступна только при входе пользователя в сеанс.

В нашей папке app/views мы создаем новый файл с именем dashboard.hbs и добавим в него следующий HTML-код.

В routes/auth.js мы добавляем эту строку внутри блока module.exports:

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

Затем мы перейдем к app/controller/authController.js и добавим контроллер панели.

Ваш AuthController.js должен выглядеть так:

Теперь запустите приложение еще раз и попробуйте зарегистрироваться с другим адресом электронной почты. Вы будете соответствующим образом перенаправлены на маршрут /dashboard.

Но /dashboard не является защищенным маршрутом, а это значит, что даже если пользователь не зашел в систему, он может его увидеть. Мы не хотим этого, поэтому мы добавим маршрут /logout, чтобы разлогинить пользователя из системы, а затем защитим маршрут и проверим, что получилось.

Давате сделаем это:

В routes/auth.js мы добавляем эту строку:

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

Затем добавим контроллер в app/controller/authController.js.

Теперь запустите приложение и зарегистрируйтесь с другим адресом электронной почты.

После этого откройте http://localhost:5000/logout, чтобы разлогинить пользователя из системы. Теперь посетите http://localhost:5000/dashboard.

Вы заметите, что он вполне доступен. Давайте добавим специальное middleware для защиты этого маршрута.

Для этого мы открываем app/routes/auth.js и добавляем эту функцию в блок module.exports, под всеми другими строками кода.

Затем мы модифицируем обработчик маршрута панели управления, чтобы он выглядел так:

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

Теперь, когда вы снова запустите приложение и попробуйте перейти на страницу панели, и если вы при этом не вошли в систему, вы должны быть перенаправлены на страницу входа.

Уф! Пришло время реализовать заключительную часть: вход.

Во-первых, мы добавим новую локальную стратегию для входа в app/config/passport/passport.js.

В этой стратегии функция isValidPassword сравнивает введенный пароль с методом сравнения bCrypt, поскольку мы сохранили наш пароль с помощью bcrypt.

Если данные верны, наш пользователь будет залогинен.

Теперь перейдите на routes/auth.js и добавьте маршрут для отправки post запросов на адрес /signin.

Ваш файл routes/auth.js должен выглядеть так, как только вы закончите.

Теперь запустите приложение и попробуйте войти. Вы должны иметь возможность войти в систему с любой информацией, которую вы использовали при регистрации, и затем вы будете перенаправлены на http://localhost:5000/dashboard/.

Поздравляю, если вы дошли до конца этого урока! Мы успешно использовали Sequelize и Passport совместно с базой данных MySQL.

Полный код этого руководства можно найти на GitHub.

Заключение

Это завершает наш учебник по использованию Passport для аутентификации пользователей с Sequelize и MySQL. Sequelize - действительно полезная ORM для работы с MySQL при использовании Node. Я лично нахожу ее очень полезной, и вы должны обязательно использовать ее в своем следующем Node-MySQL приложении.

Рекомендации

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.