Рубрики
Без рубрики

5 шагов для аутентификации Node.js с jwt

Интегрируйте аутентификацию JSON Web Token в существующий проект в течение 5 коротких шагов.

Автор оригинала: 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 работает как двусторонний протокол, где проводится запрос, а ответ генерируется с сервера.

Снятый экран 2017-04-15 в 9.59.42 AM.PNG

Браузер или запрашивающее устройство делают запрос (информацию для входа в систему пользователя для аутентификации) для 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 со следующими свойствами:

  • ФИО
  • Адрес электронной почты
  • пароль
  • Созданная дата
Снятый экран 2017-04-15 в 9.48.31 PM.PNG

3. Создайте пользовательские обработчики (I.E. Войдите в систему, регистрируйте и необходимо в логе)

В папке API/контроллеров создайте файл, называемый пользователем Usercontroller.js Бег прикосновения API/контроллеры/USERCONTROLLER.JS

В Usercontroller файл, создайте три разных обработчика для обработки

  1. Регистрация ~ Регистрация,
exports.register = function(req, res){}
  1. Войти ~ sign_in
exports.sign_in = function(req, res){}

а также

  1. Требуется логин ~ в системе
exports.loginRequired = function(req, res){}
Снятый на экран 2017-04-15 в 9.45.25 PM.PNG

В обработчике регистров мы создали создание пользовательской модели с требуемой пользовательской схемой, а затем сохраняется в 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!' });
  }
};

Диаграмма ниже показывает подробный созданный пользовательский контроллер.

Снимок экрана 2017-04-15 в 9.46.59 PM.PNG

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

Примечание: Всегда выполняйте проверку формы в свойствах тела перед сохранением их к модели пользователя.

4. Создайте маршруты пользователей и обновить «/задачи» маршрута,

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

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

var todoList = require('../controllers/todoListController');

к

var todoList = require('../controllers/todoListController'),
 userHandlers = require('../controllers/userController.js');

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

Снятый экран 2017-04-09 на 1.36.02 AM.PNG

После создания маршрута добавьте в системе боевик Обработчик к запросу пост на « /Задачи ».

Это гарантирует, что пользователь вошел в систему, прежде чем он/она может создать задачу TODO.

5. Обновление файла Server.js

Перейти к server.js Файл, нам нужно добавить вновь созданную пользовательскую модель, а также добавить промежуточное программное обеспечение на сервер Express, который проверит состояние пользователя (вошел в систему или не в системе)

Добавить пользователя, добавить

var User = require('./api/models/userModel'),
jsonwebtoken = require("jsonwebtoken");

до нужного файла в верхней части файла.

Снятый на экран 2017-04-15 в 3,37,15 вечера.

Незадолго до того, как приложенные маршруты приложены, мы добавим Express Mardware к server.js файл.

Это обеспечит промежуточное программное обеспечение перед маршрутами.

Выстрел на экране 2017-04-15 на 3,38,43 вечера.

Теперь давайте отправимся на почтальон, чтобы проверить наш регистрационный маршрут после работы:

npm run start

на терминале.

Если вы все следовали правильно, у нас должно быть:

Выстрел на экране 2017-04-09 в 11.00.17 PM.PNG

Давайте проверим, что мы сделали до сих пор по почтемату:

Запустите почтальон -> Выберите метод Post -> Добавить localhost: 3000/Задачи (Порт приложение прослушивает) к клавишам поля формы и значения в разделе URL-адреса -> Нажмите Отправить.

Код статуса 401 показывает, что наша аутентификация работает с ответом

{
  "message": "Unauthorized user!"
}
Снятый на экран 2017-04-15 на 7.08.40 PM.PNG

Теперь давайте создадим пользователь, затем подпишите пользователя для нас, чтобы получить доступ к созданию задачи TODO.

На почтальон, измените URL

/auth/Регистрация

, введите ключ и значения для FullName, Email и пароль и нажмите Отправить. Это должно дать вам ответ, как:

Выстрел на экране 2017-04-15 в 7.15.47 PM.PNG

После этого давайте подпишем пользователя с учетными данными, которые мы только что создали, изменив URL для localhost: 3000/auth/fign_in Отказ Введите клавиши и значения для электронной почты и пароля в качестве дела.

На отправке, статус 200 и созданный токен возвращается.

Выстрел на экране 2017-04-15 в 7.16.44 PM.PNG

Добавьте этот токен на заголовок авторизации, нажав на заголовок.

Снимок экрана 2017-04-15 в 8.14.40 PM.PNG

Под стоимостью добавьте JWT и токен с пространством между собой, как и так:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Затем введите параметры для ключа и значения для задачи TODO. Вы хотите создать, как показано ниже и отправьте:

Снимок экрана 2017-04-15 в 7.19.27 PM.PNG

Упаковывать его вверх

С этими 5 ступенями мы смогли добавить аутентификацию в приложение Node.js. Полный код можно найти в Github Отделение аутентификации.

Вот некоторые другие статьи в серии:

  • Построить Node.js reзов apits за 10 минут

  • 6 шагов для развертывания приложения Node.js на Heroku

  • Все, что вам нужно знать о тестировании интеграции: Supertest, Mocha и Chai

Мои другие сообщения:

  • Понимание Git Cherry-Pick: Как использовать

  • Отправка автоматизированных электронных писем с помощью сценария Google Apps