Ответ
В Node.js приложениях я обычно использую библиотеку jsonwebtoken для верификации JWT. Вот типичная реализация middleware для Express.js:
const jwt = require('jsonwebtoken');
const { JWT_SECRET } = process.env; // Секрет хранится в переменных окружения
// Middleware для проверки токена
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: 'Access token is required' });
}
jwt.verify(token, JWT_SECRET, (err, decoded) => {
if (err) {
// Детализируем ошибку для клиента
let errorMessage = 'Invalid token';
if (err.name === 'TokenExpiredError') {
errorMessage = 'Token has expired';
} else if (err.name === 'JsonWebTokenError') {
errorMessage = 'Malformed token';
}
return res.status(403).json({ error: errorMessage });
}
// Если токен валиден, добавляем данные из payload в объект запроса
req.user = decoded; // Обычно здесь id, email, roles
next(); // Передаём управление следующему обработчику
});
};
// Использование в роуте
app.get('/api/profile', authenticateToken, (req, res) => {
// req.user теперь доступен
res.json({ profile: req.user });
});
Ключевые моменты реализации:
- Секретный ключ (
JWT_SECRET) никогда не хардкодится, а берётся из переменных окружения. - Алгоритм подписи явно указывается при создании токена (например,
HS256). - Обработка ошибок детализирована: отдельно обрабатываются просроченные и невалидные токены.
- Для повышения безопасности в production можно добавить проверку списка отозванных токенов (blacklist) или использовать более сложные стратегии с refresh-токенами.