Middleware — это промежуточный слой между запросом клиента и обработчиком маршрута на сервере. Он выполняет задачи по предварительной обработке запроса: проверку данных, логирование, обработку ошибок и, в случае авторизации, проверку прав доступа. В контексте авторизации middleware становится ключевым элементом безопасности приложения.
Middleware для авторизации анализирует входящие HTTP-запросы, проверяет наличие и корректность токенов или сессий, а затем решает, может ли запрос пройти к основному обработчику маршрута.
Основные шаги:
Извлечение данных из запроса Наиболее часто
проверяется заголовок Authorization, содержащий токен
Bearer. Также могут использоваться куки или параметры запроса.
Проверка токена или сессии Токен
расшифровывается, проверяется его подпись и срок действия. Если
используется JWT (JSON Web Token), выполняется проверка поля
exp и подписи с секретным ключом.
Определение прав доступа На основе данных токена или сессии определяется роль пользователя и разрешённые действия.
Передача управления или отклонение запроса Если
проверка пройдена, middleware передает управление следующему обработчику
через вызов next(). В противном случае возвращается ошибка
401 Unauthorized или 403 Forbidden.
const jwt = require('jsonwebtoken');
function authMiddleware(requiredRole) {
return (req, res, next) => {
const authHeader = req.headers['authorization'];
if (!authHeader) {
return res.status(401).json({ message: 'Токен отсутствует' });
}
const token = authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ message: 'Некорректный токен' });
}
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
return res.status(403).json({ message: 'Токен недействителен' });
}
if (requiredRole && user.role !== requiredRole) {
return res.status(403).json({ message: 'Недостаточно прав' });
}
req.user = user; // передача данных пользователя дальше
next();
});
};
}
module.exports = authMiddleware;
Ключевые моменты примера:
req.user для
последующего использования.const express = require('express');
const router = express.Router();
const authMiddleware = require('./authMiddleware');
router.get('/admin', authMiddleware('admin'), (req, res) => {
res.json({ message: `Привет, ${req.user.name}` });
});
router.get('/profile', authMiddleware(), (req, res) => {
res.json({ profile: req.user });
});
module.exports = router;
/admin доступ разрешен только пользователям
с ролью admin./profile доступ разрешен любому
авторизованному пользователю.JWT состоит из трёх частей: заголовка, полезной нагрузки и подписи. Подпись проверяется с использованием секретного ключа. Основные операции:
const token = jwt.sign({ id: user.id, role: user.role }, process.env.JWT_SECRET, { expiresIn: '1h' });
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) throw new Error('Токен недействителен');
console.log(decoded); // объект с данными пользователя
});
Middleware для авторизации является основой надежной системы безопасности в приложениях на JavaScript. Правильная реализация гарантирует контроль доступа, предотвращение утечек данных и упрощает поддержку приложения при росте количества пользователей и маршрутов.