JWT-аутентификация в JavaScript за 5 минут

Как использовать JWT для аутентификации пользователей - Express JWT Middleware, Node.js Crypto & React

Аутентификация - сложная и в основном разделенная тема, некоторые предпочитают подход с использованием файлов cookie сеанса с сохранением состояния, а другие выбирают JWT без сохранения состояния. Я один из последних, так как мне нравится, насколько быстро и эффективно внедряется JWT Auth.

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

1. Пароли

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

Предположим, злоумышленник (хакер) получил доступ к нашей базе данных, что уже является серьезной проблемой безопасности, и поэтому наше приложение было скомпрометировано. Если мы сохранили информацию для входа в открытый текст, злоумышленник может повторно использовать комбинацию электронной почты и пароля для доступа к другим распространенным веб-сайтам, которые пользователь может использовать, например, к Google или даже к онлайн-банку.

Да, большинство этих платформ требует 2FA или других дополнительных шагов для аутентификации, но это не причина сознательно рисковать раскрытием учетных данных клиента.

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

Хеш - это результат работы криптографической функции, которая получает ввод и всегда возвращает уникальный фиксированный размер (256 бит для SHA256) для этого конкретного ввода.

Сгенерировать SHA256

2. Аутентификация (JWT)

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

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

Но как мы создаем этот токен и где его хранить на клиенте?

Давайте посмотрим, как мы можем использовать JWT для аутентификации пользователей в приложении Express:

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

Создать JWT

Сначала нам нужно создать наш образец проекта с помощью следующих команд:

После этого просто создайте index.js файл и добавьте стартовый скрипт в package.json следующим образом "start": "node index"

Нам нужно предоставить 2 конечные точки, одну для регистрации пользователей, а другую для входа в систему.

регистр

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

Авторизоваться

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

Магазин JWT

Есть 2 распространенных способа сохранить JWT на стороне клиента:

  • Печенье
  • Локальное хранилище

Оба связаны с проблемами безопасности, такими как XSS, CSRF или расширенный XST, поэтому ни один из этих вариантов хранения не является полностью безопасным.

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

Предположим, что наш клиент - это SPA, а точнее приложение на основе React, и клиент часто делает запросы к API с помощью клиента Axios.

Давайте создадим собственный клиентский класс Axios, который мы назовем request.js.

Мы будем использовать response-cookie, поскольку он предоставляет простой API-интерфейс для управления файлами cookie.

Заключение

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

Если вы хотите проверить код, вот ссылка CodeSandbox.

Другие мои работы можно найти на alexstreza.dev.

Надеюсь, вам понравилась эта короткая демонстрация аутентификации JWT в JavaScript, и вам понравится, если вы поставите ей!

Больше контента на plainenglish.io