Middleware для авторизации

Middleware — это промежуточный слой между запросом клиента и обработчиком маршрута на сервере. Он выполняет задачи по предварительной обработке запроса: проверку данных, логирование, обработку ошибок и, в случае авторизации, проверку прав доступа. В контексте авторизации middleware становится ключевым элементом безопасности приложения.


Принципы работы middleware для авторизации

Middleware для авторизации анализирует входящие HTTP-запросы, проверяет наличие и корректность токенов или сессий, а затем решает, может ли запрос пройти к основному обработчику маршрута.

Основные шаги:

  1. Извлечение данных из запроса Наиболее часто проверяется заголовок Authorization, содержащий токен Bearer. Также могут использоваться куки или параметры запроса.

  2. Проверка токена или сессии Токен расшифровывается, проверяется его подпись и срок действия. Если используется JWT (JSON Web Token), выполняется проверка поля exp и подписи с секретным ключом.

  3. Определение прав доступа На основе данных токена или сессии определяется роль пользователя и разрешённые действия.

  4. Передача управления или отклонение запроса Если проверка пройдена, middleware передает управление следующему обработчику через вызов next(). В противном случае возвращается ошибка 401 Unauthorized или 403 Forbidden.


Пример middleware на Node.js с использованием Express

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;

Ключевые моменты примера:

  • Функция возвращает middleware, позволяя динамически задавать требуемую роль.
  • Обработка ошибок происходит сразу, чтобы запросы без корректной авторизации не доходили до основного обработчика.
  • Данные пользователя сохраняются в req.user для последующего использования.

Использование middleware в маршрутах

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

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); // объект с данными пользователя
});
  • Обновление токена выполняется через механизм refresh token, чтобы избежать частого запроса повторной авторизации.

Роль middleware в безопасности приложения

  1. Изоляция маршрутов — разные уровни доступа для обычных пользователей и администраторов.
  2. Защита от несанкционированного доступа — предотвращение выполнения критичных операций без авторизации.
  3. Централизованная логика проверки — все маршруты используют одно и то же правило проверки, что уменьшает вероятность ошибок.
  4. Поддержка масштабируемости — middleware легко расширяется, например, добавлением проверки активности сессии или дополнительных условий доступа.

Дополнительные практики

  • Логирование попыток несанкционированного доступа для анализа атак.
  • Использование HTTPS для защиты токенов при передаче по сети.
  • Минимизация информации в токене — хранить только необходимую для авторизации информацию.
  • Регулярная ротация секретов для JWT, чтобы снижать риск компрометации.

Middleware для авторизации является основой надежной системы безопасности в приложениях на JavaScript. Правильная реализация гарантирует контроль доступа, предотвращение утечек данных и упрощает поддержку приложения при росте количества пользователей и маршрутов.