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

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

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

Начать курс

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

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

Что такое JWT и зачем он нужен?

JWT представляет собой строку, состоящую из трех частей, разделенных точками: Header (заголовок), Payload (полезная нагрузка) и Signature (подпись). Токен выглядит так: xxxxx.yyyyy.zzzzz. Основные преимущества JWT:

  • Безопасность — токен подписывается секретным ключом или парой ключей (RSA/ECDSA), что гарантирует его целостность.
  • Самодостаточность — вся необходимая информация для проверки подлинности содержится в самом токене, что уменьшает количество запросов к базе данных.
  • Кроссплатформенность — JWT работает с любым языком программирования и платформой.
  • Гибкость — вы можете добавлять любые пользовательские данные в payload (например, ID пользователя, роль).

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

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

npm install jsonwebtoken

После установки подключите библиотеку в вашем файле:

const jwt = require('jsonwebtoken');

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

Для создания токена используется метод jwt.sign(payload, secretOrPrivateKey, options). Рассмотрим базовый пример:

const jwt = require('jsonwebtoken');

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

const secretKey = 'my_super_secret_key_123';

const token = jwt.sign(payload, secretKey, {
  expiresIn: '1h', // токен истечет через 1 час
  algorithm: 'HS256' // алгоритм подписи (по умолчанию HS256)
});

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

Важно: Никогда не храните секретный ключ в коде. Используйте переменные окружения (.env файл). Для этого установите пакет dotenv:

npm install dotenv

Пример использования с переменными окружения:

require('dotenv').config();
const jwt = require('jsonwebtoken');

const token = jwt.sign(
  { userId: 456 },
  process.env.JWT_SECRET,
  { expiresIn: '7d' }
);

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

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

const token = 'ваш_токен_здесь';

try {
  const decoded = jwt.verify(token, process.env.JWT_SECRET);
  console.log('Декодированные данные:', decoded);
  // { userId: 456, iat: 1700000000, exp: 1700600000 }
} catch (err) {
  if (err.name === 'TokenExpiredError') {
    console.log('Токен истек');
  } else if (err.name === 'JsonWebTokenError') {
    console.log('Недействительный токен');
  } else {
    console.log('Ошибка верификации:', err.message);
  }
}

Обратите внимание на поля iat (issued at — время создания) и exp (expiration time — время истечения), которые автоматически добавляются, если указан параметр expiresIn.

Middleware для Express.js

В реальных приложениях JWT обычно проверяется в middleware. Вот пример для Express.js:

const express = require('express');
const jwt = require('jsonwebtoken');
require('dotenv').config();

const app = express();

// Middleware для проверки JWT
const authenticateToken = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN

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

  jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
    if (err) {
      return res.status(403).json({ error: 'Недействительный токен' });
    }
    req.user = user;                    

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