JWT токены в JavaScript (Node.js): полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

JWT токены в JavaScript (Node.js)

JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанных на JSON. JWT широко используется для аутентификации и обмена информацией между клиентом и сервером в современных веб-приложениях на Node.js. В этой статье мы разберем, как работать с JWT в среде Node.js с помощью популярной библиотеки jsonwebtoken.

Что такое JWT?

JWT состоит из трех частей, разделенных точками:

  • Header — заголовок, содержащий тип токена и алгоритм подписи (например, HS256 или RS256).
  • Payload — полезная нагрузка, в которой хранятся данные (claims): идентификатор пользователя, роль, время жизни токена и т.д.
  • Signature — подпись, созданная на основе header, payload и секретного ключа. Подпись гарантирует, что токен не был изменен.

Визуально JWT выглядит так: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Установка библиотеки jsonwebtoken

Для работы с JWT в Node.js используется пакет jsonwebtoken. Установите его через npm:

npm install jsonwebtoken

После установки вы можете импортировать библиотеку в свой проект:

const jwt = require('jsonwebtoken');

Генерация (подпись) JWT токена

Для создания токена используйте метод jwt.sign(). Он принимает три основных параметра:

  • payload — объект с данными, которые нужно закодировать в токене.
  • secretOrPrivateKey — секретный ключ (или приватный ключ для алгоритмов RSA/ECDSA).
  • options — объект с опциями, например, expiresIn для задания времени жизни токена.

Пример генерации токена:

const jwt = require('jsonwebtoken');

const payload = {
  userId: 12345,
  role: 'user'
};

const secretKey = 'your-secret-key-here';

const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });

console.log('Сгенерированный JWT:', token);

В этом примере токен будет действителен в течение 1 часа. Вы также можете указать время в секундах (expiresIn: 3600) или в других форматах, например, '7d' (7 дней) или '30m' (30 минут).

Проверка (верификация) JWT токена

Для проверки подлинности токена используется метод jwt.verify(). Он возвращает декодированный payload, если токен валиден, или выбрасывает ошибку, если токен истек или подпись неверна.

const jwt = require('jsonwebtoken');

const token = 'eyJhbGciOiJIUzI1NiIs...'; // ваш токен
const secretKey = 'your-secret-key-here';

try {
  const decoded = jwt.verify(token, secretKey);
  console.log('Декодированные данные:', decoded);
} catch (err) {
  console.error('Ошибка верификации:', err.message);
}

Если токен истек, вы получите ошибку 'jwt expired'. Если подпись неверна — 'invalid signature'.

Декодирование без проверки подписи

Иногда нужно просто прочитать данные из токена без проверки подписи (например, для отладки). Для этого используйте jwt.decode():

const jwt = require('jsonwebtoken');

const token = 'eyJhbGciOiJIUzI1NiIs...';
const decoded = jwt.decode(token);

console.log('Payload без проверки:', decoded);

Важно: jwt.decode() не проверяет подпись, поэтому не используйте его для аутентификации в production.

Middleware для Express с JWT

В веб-приложениях на Express JWT часто используется для защиты маршрутов. Создадим простой middleware, который проверяет токен из заголовка Authorization:

const jwt = require('jsonwebtoken');

function authMiddleware(req, res, next) {
  const authHeader = req.headers.authorization;

  if (!authHeader) {
    return res.status(401).json({ message: 'Токен не предоставлен' });
  }

  const token = authHeader.split(' ')[1]; // Bearer <token>                    

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