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; Также в библиотеке
ORM для Swift (iOS/macOS): сравнение и примеры использования
Работа с ZIP-архивами в C# (.NET): полное руководство
Мониторинг приложений Kotlin: обзор инструментов и библиотек