Как создать пример системы аутентификации JWT узла

Учебное пособие по аутентификации JWT для узлов — это тема, которую мы обсудим сегодня. Полная форма JWT — это веб-токен JSON. Если мы хотим создать безопасное веб-приложение, мы должны реализовать аутентификацию. После этого нам нужно разработать авторизацию. Существует два типа аутентификации, которые вы можете использовать при разработке любого веб-приложения.

  1. Аутентификация на основе сеанса
  2. Аутентификация на основе токенов

Пользовательские сеансы на основе JWT

Начнем с знакомства с тем, как веб-токены JSON могут использоваться для установления сеанса пользователя: в двух словах, JWT — это полезные данные JSON с цифровой подписью, закодированные в формате строки, удобной для URL.

JWT может содержать любую полезную нагрузку в целом, но наиболее распространенный вариант использования — использовать полезную нагрузку для определения пользовательского сеанса.

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

Если JWT используются для аутентификации, они будут содержать как минимум идентификатор пользователя и отметку времени истечения срока действия.

Если вам интересно узнать, как выглядит JWT, то вот пример:

 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyjzdWIiOiNIVIxMjODI.  .SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 

Чтобы узнать, какова полезная нагрузка в указанном выше токене, давайте перейдем к jwt.io и вставим полную строку JWT в инструмент проверки, затем мы увидим полезную нагрузку JSON

Свойство sub содержит идентификатор пользователя, а свойство user содержит пользователя. Этот тип токена известен как токен на предъявителя, что означает, что он идентифицирует пользователя, которому он принадлежит, и определяет сеанс пользователя.

Токен на предъявителя является подписанной временной заменой для комбинация имени пользователя и пароля!

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

Самый первый шаг для реализации аутентификации на основе JWT — выпустить токен-носитель и передать его пользователю, и это основная цель страницы входа/регистрации.

Аутентификация на основе токена JWT

В сегодняшней теме мы будем использовать аутентификацию на основе токена . Если вы хотите изучить аутентификацию на основе сеанса, ознакомьтесь с моей статьей «Простая система аутентификации Nodejs с использованием паспорта». В этой статье я кратко описал аутентификацию на основе сеанса.

Аутентификация JWT в наши дни становится очень популярной.

При традиционной аутентификации используются файлы cookie и сеансы.. С появлением одностраничных приложений (SPA) и микросервисов возникла необходимость выходить за рамки сессий. Этой цели служит любая аутентификация на основе токенов.

JWT — это тип аутентификации на основе токенов. Для каждого отдельного запроса от клиента к серверу для аутентификации передается токен.

Что наиболее важно, он поддерживает вызовы API без сохранения состояния.

Аутентификация на основе токенов сегодня повсюду в Интернете. Практически каждая веб-компания использует API, поэтому аутентификация по токенам — лучший способ аутентификации для нескольких пользователей.

Почему мы используем аутентификацию на основе токенов

Аутентификация на основе сеанса — это нормально, тогда почему мы хотим использовать аутентификацию на основе токенов? Причины следующие.

  1. Основная причина в том, что это аутентификация без сохранения состояния. Этот токен хранится в локальном хранилище на стороне клиента, но также может храниться в хранилище сеанса или в файле cookie.
  2. В большинстве случаев его использование — это одностраничные приложения, веб-API и Интернет вещей (IoT).
  3. Если наше приложение масштабируемо и развязано, то лучше всего использовать этот де-факто стандарт.
  4. Это мобильное веб-приложение, подготовленное независимо от того, какие технологии вы используете для создания своего веб-приложения и мобильного приложения.
  5. Удобно : Использование JWT для аутентификации на сервере после входа в систему требует установки одного HTTP-заголовка, задачи, которую можно легко автоматизировать с помощью функции или создания подклассов, как мы увидим позже.
  6. Compact : токен — это просто строка в кодировке base64, содержащая несколько полей заголовка и полезную нагрузку, если требуется. Общий размер JWT обычно составляет менее 200 байт, даже если он подписан.
  7. Secure : хотя это и не требуется, отличная функция безопасности JWT заключается в том, что токены могут быть подписаны. с использованием шифрования пары открытых/закрытых ключей RSA или шифрования HMAC с использованием общего секрета. Это гарантирует происхождение и действительность токена.

Все это сводится к тому, что у вас есть безопасный и эффективный способ аутентификации пользователей, а затем проверки вызовов к конечным точкам API без необходимости анализировать какие-либо структуры данных и реализовывать свое шифрование.

Как работает JWT (веб-токены JSON)?

JSON web токены — это текстовые строки, которые могут использоваться клиентом и серверами для простой аутентификации и обмена информацией.

Если вы помните необходимую аутентификацию, мы записываем информацию клиенту, записывая cookie как переменную сеанса.

Однако в JWT токен кодируется из полезной нагрузки данных с использованием секрета. Этот токен передается клиенту. Всякий раз, когда клиент отправляет этот токен вместе с запросом, сервер проверяет его и отправляет обратно ответ. См. Эту схему для получения четкого изображения.

JSON Web Token — это токен; нам нужно помещать заголовок в каждый запрос для проверки клиента. Архитектура аутентификации JWT чертовски хороша простой.

  1. Первый пользователь пытается войти в систему со своими учетными данными.
  2. После того, как сервер проверяет учетные данные, сервер генерирует и отправляет Веб-токен JSON для клиента.
  3. Затем клиент сохраняет этот токен в локальном хранилище или любом другом механизме хранения.
  4. Опять же, если клиент хочет запросить защищенный маршрут или ресурс, затем он отправляет JWT в заголовке запроса.
  5. Сервер проверяет, что JWT и, если он правильный, вернуть ответ 200 с информацией, необходимой клиенту.
  6. Если JWT недействителен, то он дает несанкционированный доступ или любое другое сообщение с ограничениями.

Вы можете спросить: «Мне все ясно, кроме того, как сервер генерирует JWT?». Создание токена JWT n — обширная и красивая тема, и здесь вы узнаете много подробностей. https://jwt.io/introduction/

После прочтения всего алгоритма генерации токенов у вас может возникнуть соблазн написать свою функциональность.

Подождите! Уже существует множество библиотек на разных языках. Вы подключаете их, и вы получаете две основные функции для создания JWT, проверки JWT и т. Д.

Здесь я выбираю библиотеку NPM под названием jsonwebtoken, которую предлагает веб-сайт JWT вместо того, чтобы заново изобретать колесо.

Пример аутентификации JWT узла

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

Шаг 1. Установите зависимости node js.

Создайте одну папку проекта и перейдите в эту папку . Введите следующую команду.

 npm init 

Теперь установите следующие зависимости.

 npm install express jsonwebtoken mongoose body-parser -  -save 

Он установит веб-фреймворк Express , пакет jsonwebtoken для аутентификации пользователя, mongoose и промежуточное ПО body-parser .

Кроме того, нам необходимо установить сервер разработки nodemon . для предотвращения остановки и перезапуска серверного процесса. Итак, давайте сделаем это в первую очередь.

 npm install nodemon --save-dev 

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

Шаг 2. Настройте сервер узла.

В файле package.json измените этот объект на следующие.

 "scripts": {"start": "nodemon server"}, 

Итак, в терминале, когда мы набираем npm start , мы загружаем файл server.js .
В корневой папке создайте один файл с именем server.js. Настройте сервер узла.

//server.jsconst express = require ('express'); const app = express (); const bodyParser = require ('body-parser')  ; const PORT = 3000; app.listen (PORT, function () {console.log ('Сервер работает на порту', PORT);}); 

Теперь перейдите в терминал и нажмите следующую инструкцию.

 npm start 

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

Шаг 3. Отправьте запрос к серверу узла через Postman.

Сначала мы определяем один маршрут и отправляем клиенту ответ JSON.

//server.jsapp  .get ('/verify', function (req, res) {res.json ({"Tutorial": "Добро пожаловать в Node express JWT Tutorial"});}); 

Откройте Почтальон и отправьте запрос на получение по адресу

Шаг 4. Настройте базу данных MongoDB.

Напишите следующий код для подключения Node.js в базу данных MongoDB .

//server.jsconst mongoose = require ('mongoose'); mongoose.  connect ('mongodb://localhost/jwtauth'); 

Кроме того, добавьте в приложение промежуточное ПО body-parser .

//server.jsapp.use (bodyParser.urlencoded ({ext  завершено: false})); app.use (bodyParser.json ()); 

Шаг 5. Создайте модель пользователя.

Создайте в корне одну новую папку с именем models. В этом случае создайте один файл с именем user.model.js file.

//user.model.jsconst mongoose = require ('mongoose'  ); const user = mongoose.Schema ({_id: mongoose.Schema.Types.ObjectId, email: {type: String, required: true}, password: {type: String, required: true}}); module.exports =  mongoose.model ('User', user); 

Мы определили схему для коллекции User.

Шаг 6. Создайте маршруты для пользователей.

Создайте в корне одну папку с именем routes. В этой папке создайте один файл с именем user.route.js. Теперь нам нужно зарегистрировать пользователя для нашего приложения. Итак, давайте определим маршрут публикации для регистрации пользователя.

Нам также понадобится модуль bcrypt для хеширования пароля. Мы не можем хранить простой пароль . Итак, давайте сначала установим модуль bcrypt.

 npm install bcrypt --save 

Затем напишите следующий код в user.route. js .

//user.route.jsconst express = require ('express'); const router = express.Router (); const mongoose = require ('mongoose')  ; const bcrypt = require ('bcrypt'); const User = require ('../models/user. model '); router.post ('/signup ', function (req, res) {bcrypt.hash (req.body.password, 10, function (err, hash) {if (err) {return res.status (500  ) .json ({error: err});} else {const user = new User ({_id: new mongoose.Types.ObjectId (), email: req.body.email, password: hash}); user.save (  ) .then (function (result) {console.log (result); res.status (200) .json ({success: 'Новый пользователь был создан'});}). catch (error => {res.status  (500) .json ({error: err});});}});}); module.exports = router; 

Что он делает, так это то, что он пытается хешировать входящий запрос пароль свойство. Если этого сделать не удалось, то возвращается ответ с ошибкой в ​​формате json.

В случае успеха он создаст нового пользователя и добавит его в базу данных MongoDB . Теперь включите этот файл user.route.js в файл server.js . Сейчас я пишу весь файл.

//server.jsconst express = require ('express'); const app = express (); const bodyParser = require ('body-parser');  const user = require ('./routes/user.route'); const mongoose = require ('mongoose'); mongoose.connect ('mongodb://localhost/jwtauth'); const PORT = 3000; app.use (  bodyParser.urlencoded ({extended: false})); app.use (bodyParser.json ()); app.get ('/check', function (req, res) {res.json ({"Учебник": "Добро пожаловать  к Node express JWT Tutorial "});}); app.use ('/user', user); app.listen (PORT, function () {console.log ('Сервер работает на порту', ПОРТ);  }); 

Шаг 7. Отправьте запрос на публикацию от почтальона.

Откройте почтальон отправить запрос в формате строки с типом приложения json ( application/json ).

Как видите, я успешно создал пользователей. Теперь я использую Studio 3T для MongoDB. Итак, вот новый пользователь в базе данных.

Шаг 8: Войдите в систему.

Перейдите в файл user.route.js и определите маршрут входа.

//user.route.jsrouter.post ('/signin', function (req, res) {User.findOne ({email: req.body.email}) .exec ().  then (function (user) {bcrypt.compare (req.body.password, user.password, function (err, result) {if (err) {return res.status (401) .json ({failed: 'Unauthorized Access'  });} if (result) {return res.status (200) .json ({success: 'Добро пожаловать в JWT Auth'});} return res.status (401) .json ({failed: 'Unauthorized Access'  });});}) .catch (error => {res.status (500) .json ({error: error});}) ;;}); 

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

Если попытка аутентификации не удалась, мы получим следующую ошибку.

Шаг 9. Верните JWT, если попытка аутентификации прошла успешно.

У нас есть несколько разных способов отправить токен обратно пользователю, например:

  1. В cookie
  2. В теле ответа HTTP.
  3. В простом заголовке HTTP

Начнем с файлов cookie, почему бы их не использовать? JWT иногда упоминаются как альтернатива файлам cookie, но это две очень разные концепции. Файлы cookie — это механизм хранения данных браузера, место, где мы можем безопасно хранить небольшой объем данных.

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

Таким образом, мы можем, например, сохранить JWT в файле cookie! Затем давайте поговорим о преимуществах и недостатках использования файлов cookie для хранения JWT по сравнению с другими методами.

Отправка JWT обратно в теле ответа HTTP

Файлы cookie с их уникальным свойством HTTP Only — хороший выбор для хранения JWT, но есть и другие хорошие варианты. Например, вместо файлов cookie мы собираемся отправить JWT обратно клиенту в теле ответа HTTP.

Мы не только хотим отправить обратно сам JWT, но лучше отправить также метка времени истечения как отдельное свойство.

Верно, что метка времени истечения также доступна внутри JWT, но мы хотим упростить для клиента получение продолжительности сеанса без необходимости установки Библиотека JWT только для этого.

Мы отправим токен JWT в теле ответа.

Если адрес электронной почты и пароль пользователя действительны, то в ответ , нам нужно вернуть токен JWT. Итак, давайте сгенерируем токен и вернемся к пользователю.

//user.route.jsconst jwt = require ('jsonwebtoken'); if (result) {const JWTToken = jwt.sign ({  электронная почта: user.email, _id: user._id}, 'secret', {expiresIn: '2h'});  return res.status (200) .json ({успех: 'Добро пожаловать в JWT Auth', токен: JWTToken});  } 

Формат токена JWT следующий.

ЗАГОЛОВОК: АЛГОРИТМ И ТИП ТОКЕНА

{
«alg»: «HS256»,
«typ»: «JWT»
}

PAYLOAD : DATA

{
«электронная почта»: «krunallathiya10@gmail.com»,
«_ id»: «5a7c9bd8fc3e501c94aa6035»,
«Iat»: 1518120124,
«exp»: 1518127324
}

ПРОВЕРИТЬ ПОДПИСЬ

 HMACSHA256 (base64UrlEncode (заголовок) + ". "+ base64UrlEncode (полезная нагрузка), секрет) 

Итак, мы предоставляем комбинацию заголовка, полезной нагрузки и секретного ключа. Помните, вам необходимо определить свой секретный ключ в переменной среды файл. Я только что показал здесь для демо-целей. Таким образом, он будет производить следующее JWT маркер .

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImtydW5hbGxhdGhpeWExMEBnbWFpbC5jb20iLCJfaWQiOiI1YTdjOWJkOGZjM2U1MDFjOTRhYTYwMzUiLCJpYXQiOjE1MTgxMjAxMjQsImV4cCI6MTUxODEyNzMyNH0. _6qVGQV_KYlonawnaTHG-OhOJLV4tgD-Eob5iRz89AM

Теперь используйте этот токен для доступа защищенные ресурсы для вашего приложения.

На этом мы почти закончили со статьей Node JWT Authentication. Теперь нам нужно выполнить несколько клиентских операций.

Хранение и использование JWT на стороне клиента

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

Есть много мест, где мы могли бы сохранить JWT (кроме файлов cookie). Практическое место для хранения JWT находится в локальном хранилище, которое представляет собой хранилище ключей/значений для строковых значений, которое идеально подходит для хранения небольшого объема данных.

Обратите внимание, что локальное хранилище имеет асинхронный API . Давайте посмотрим на реализацию логики входа/выхода с использованием локального хранилища.

Отправка JWT на сервер при каждом запросе

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

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

Вот что нам нужно сделать: нам нужно с каждым HTTP-запросом, отправленным на сервер приложений, каким-то образом также добавьте JWT!

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

Наконец, наш Пример аутентификации JWT узла с нуля завершен. Я также разместил этот код на Github.

У меня есть код проекта Node JWT Authentication на Github. Пожалуйста, проверьте это.

Fork Me On Github

Оцените статью
nanomode.ru
Добавить комментарий