Автор оригинала: Olatunde Michael Garuba.
В этой статье я буду ходить за вами через 5 шагов, с помощью которых вы можете интегрировать аутентификацию JWT в свой существующий проект.
Для тех, кто подходит для моих серий, у нас есть приложение для списка TODO, и мы имеем письменные тесты для приложения. К концу этого учебника только зарегистрированный пользователь сможет создать задачу TODO, что означает, что пользователи приложений должны регистрироваться.
Теперь сначала начнем с некоторых оснований.
Что такое JWT?
Json Web Token (JWT) определяет явную, компактную и самососодержащую защищенный протокол для передачи ограниченной информации. Это часто используется для отправки информации, которая может быть проверена и довериться с помощью цифровой подписи.
Установка претензий JWT представляет собой компактный объект JSON Safe URL-json, то есть Base64URL, закодированным и цифровым подписанным и/или зашифрованным. Объект JSON состоит из нулевых или более пар имени/значения (или элементов), где имена являются строками, а значения являются произвольными значениями JSON. Эти члены являются претензиями, представленными JWT. Вот пример JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE
JSON WEB TOKENS состоят из трех частей, разделенных точками (I.E. Header.PAYLOAD.Signature
)
Как работает JWT
JWT работает как двусторонний протокол, где проводится запрос, а ответ генерируется с сервера.
Браузер или запрашивающее устройство делают запрос (информацию для входа в систему пользователя для аутентификации) для JWT в закодированных данных, сервер генерирует подписанный токен и возврат к клиенту (мобильное устройство/браузер), как показано на диаграмме выше.
Впоследствии токен может быть отправлен на запрос HTTP для каждого другого запроса, который нуждается в аутентификации на сервере. Затем сервер проверяет токен и, если он действителен, возвращает безопасный ресурс клиенту.
Этот токен часто подписывается с использованием любого безопасного метода подписи (алгоритм асимметричного ключа E.G, такой как HMAC SHA-256 или асимметричный, системе общего клавиш, например RSA).
Преимущества JWT?
Компактный: JWT является компактным, что означает, что его можно отправить вместе с HTTP-запросом либо в виде тела, либо в качестве атрибута заголовка.
Без гражданства/самостоятельно: Токен содержит всю информацию для идентификации пользователя, которая устраняет необходимость состояния сеанса. Если мы используем балансировщик нагрузки, мы можем передавать пользователя на любой сервер, вместо того, чтобы быть связанным с тем же сервером, на котором мы вошли в систему. Это также усиливает производительность, поскольку нет поиска на стороне сервера для десериализации по каждому запросу
Повторножеемость: У нас может быть много отдельных серверов, которые работают на нескольких платформах и доменах и повторно используют тот же токен для аутентификации пользователя. Легко создать приложение, которое разделяет разрешения с другим приложением.
Безопасность: Нет необходимости беспокоиться о атаках для перекрестных запросов (CSRF).
Пререквизит:
- Node.js.
- Node.js приложение
Инструменты:
- Пакет jsswebtokn,
- Пакет BCRYPT и
- Почтальон.
Теперь давайте подтвердимся подлинность/защищать несколько маршрутов.
Шаги:
1. Установите пакет «JSONWebkoken» NPM Установите JSONWebTokn -> Сохранить
Jsonwebtoken – это модуль упаковки узла, который развивался против Проект-IETF-Jose-Json-Web-Signature-08
с подписанием цепочки сертификата/проверки.
2. Создайте модель пользователя
В папке API/Models создайте файл, называемый пользователем Usermodel.js
Бег прикосновения API/моделей/ Usermodel.js
Отказ
Как вы знаете, Mongodb позволяет нам создать схему, где мы можем создавать документы. Мы будем использовать это для создания пользователя непосредственно в пользовательском документе.
В этом файле создайте схему Mongoose со следующими свойствами:
- ФИО
- Адрес электронной почты
- пароль
- Созданная дата
3. Создайте пользовательские обработчики (I.E. Войдите в систему, регистрируйте и необходимо в логе)
В папке API/контроллеров создайте файл, называемый пользователем Usercontroller.js
Бег прикосновения API/контроллеры/USERCONTROLLER.JS
В Usercontroller
файл, создайте три разных обработчика для обработки
- Регистрация ~ Регистрация,
exports.register = function(req, res){}
- Войти ~ sign_in
exports.sign_in = function(req, res){}
а также
- Требуется логин ~ в системе
exports.loginRequired = function(req, res){}
В обработчике регистров мы создали создание пользовательской модели с требуемой пользовательской схемой, а затем сохраняется в MongoDB.
exports.register = function(req, res) { var newUser = new User(req.body); newUser.hash_password = bcrypt.hashSync(req.body.password, 10); newUser.save(function(err, user) { if (err) { return res.status(400).send({ message: err }); } else { user.hash_password = undefined; return res.json(user); } }); };
Примечание: Хэш-пароль был сохранен в базе данных с использованием BCRYPT.
sign_in
Обработчик обрабатывает знак пользователя в деятельности. Следовательно, нам нужно проверить и посмотреть, будет ли пользователь уже сохранен в базе данных. Если да, мы должны проверить, соответствует ли введенные параметры, сохраненные пользователем в базе данных.
Если пользователь или введенные параметры не совпадают с сохраненными данными, мы возвращаем ошибку с определенным сообщением.
exports.sign_in = function(req, res) { User.findOne({ email: req.body.email }, function(err, user) { if (err) throw err; if (!user) { res.status(401).json({ message: 'Authentication failed. User not found.' }); } else if (user) { if (!user.comparePassword(req.body.password)) { res.status(401).json({ message: 'Authentication failed. Wrong password.' }); } else { return res.json({token: jwt.sign({ email: user.email, fullName: user.fullName, _id: user._id}, 'RESTFULAPIs')}); } } }); };
В в системе боевик
Мы проверяем, подписан ли пользователь. Если пользователь включен, пользователю разрешено выполнять следующие виды деятельности; Иначе мы возвращаем пользователя несанкционированное сообщение в этом случае, как так:
exports.loginRequired = function(req, res, next) { if (req.user) { next(); } else { return res.status(401).json({ message: 'Unauthorized user!' }); } };
Диаграмма ниже показывает подробный созданный пользовательский контроллер.
Как показано на диаграмме выше, наша модель и JWT были доступны для файлов, которые требуют их в первую очередь и прежде всего. В обработчике регистрации мы создали нашу пользовательскую модель с помощью данных формы, после чего мы сохранили документ в базе данных.
Примечание: Всегда выполняйте проверку формы в свойствах тела перед сохранением их к модели пользователя.
4. Создайте маршруты пользователей и обновить «/задачи» маршрута,
Поскольку у нас есть несколько маршрутов раньше, давайте обновим его, добавив две другие маршруты для пользовательских мероприятий.
Прежде всего, давайте сделаем пользовательские обработчики доступными в маршрутах, прежде чем создать маршруты, путем обновления:
var todoList = require('../controllers/todoListController');
к
var todoList = require('../controllers/todoListController'), userHandlers = require('../controllers/userController.js');
Вот маршрут для пользователя для регистрации/регистрации в приложении, а также маршрут для пользователя, чтобы вписаться/иметь доступ к приложению с их созданными учетными данными:
После создания маршрута добавьте в системе боевик
Обработчик к запросу пост на « /Задачи
».
Это гарантирует, что пользователь вошел в систему, прежде чем он/она может создать задачу TODO.
5. Обновление файла Server.js
Перейти к server.js
Файл, нам нужно добавить вновь созданную пользовательскую модель, а также добавить промежуточное программное обеспечение на сервер Express, который проверит состояние пользователя (вошел в систему или не в системе)
Добавить пользователя, добавить
var User = require('./api/models/userModel'), jsonwebtoken = require("jsonwebtoken");
до нужного файла в верхней части файла.
Незадолго до того, как приложенные маршруты приложены, мы добавим Express Mardware к server.js
файл.
Это обеспечит промежуточное программное обеспечение перед маршрутами.
Теперь давайте отправимся на почтальон, чтобы проверить наш регистрационный маршрут после работы:
npm run start
на терминале.
Если вы все следовали правильно, у нас должно быть:
Давайте проверим, что мы сделали до сих пор по почтемату:
Запустите почтальон -> Выберите метод Post -> Добавить localhost: 3000/Задачи
(Порт приложение прослушивает) к клавишам поля формы и значения в разделе URL-адреса -> Нажмите Отправить.
Код статуса 401 показывает, что наша аутентификация работает с ответом
{ "message": "Unauthorized user!" }
Теперь давайте создадим пользователь, затем подпишите пользователя для нас, чтобы получить доступ к созданию задачи TODO.
На почтальон, измените URL
/auth/Регистрация
, введите ключ и значения для FullName, Email и пароль и нажмите Отправить. Это должно дать вам ответ, как:
После этого давайте подпишем пользователя с учетными данными, которые мы только что создали, изменив URL для localhost: 3000/auth/fign_in
Отказ Введите клавиши и значения для электронной почты и пароля в качестве дела.
На отправке, статус 200 и созданный токен возвращается.
Добавьте этот токен на заголовок авторизации, нажав на заголовок.
Под стоимостью добавьте JWT и токен с пространством между собой, как и так:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE
Затем введите параметры для ключа и значения для задачи TODO. Вы хотите создать, как показано ниже и отправьте:
Упаковывать его вверх
С этими 5 ступенями мы смогли добавить аутентификацию в приложение Node.js. Полный код можно найти в Github Отделение аутентификации.
Вот некоторые другие статьи в серии:
Построить Node.js reзов apits за 10 минут
6 шагов для развертывания приложения Node.js на Heroku
Все, что вам нужно знать о тестировании интеграции: Supertest, Mocha и Chai
Мои другие сообщения:
Понимание Git Cherry-Pick: Как использовать
Отправка автоматизированных электронных писем с помощью сценария Google Apps