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

Необходимость в проверке прав пользователя на выполнение определенных действий (прав на обращение в ендпоинтам) с помощью токена возникает очень часто. Поэтому для этого обычно создается отдельный middleware.

Этот middleware делает следующие действия:

  • извлекает токен (с заголовка "Authorization" или кукис)

  • если токена нет или токен не было найдено в нашей БД - отвечает пользователю с ошибкой 401

  • если у пользователя, что соответствует данному токена, не хватает прав на выполнение заданного запроса - отвечает пользователю с ошибкой 403

  • если все предыдущие проверки прошли успешно - добавляет в Request-объект (req) пользователя и его токен и передает обработку запроса на следующий middleware.

Одна из возможных реализаций middleware:

async function authorize(req, res, next) {
  try {
    // 1. достать токен пользователя с заголовка Authorization
    const authorizationHeader = req.get("Authorization");
    const token = authorizationHeader.replace("Bearer ", "");

    // 2. достать id пользователя с пейлоада или вернуть пользователю
    // ошибку со статус кодом 401
    let userId;
    try {
      userId = await jwt.verify(token, config.jwtSecret).userId;
    } catch (err) {
      next(new UnauthorizedError("User not authorized"));
    }
    
    // 3. достать соответствующего пользователя. Если такого нет - вернуть
    // ошибку со статус кодом 401
    // userModel - модель пользователя в нашей системе
    const user = await userModel.findUserById(
      userId
    );
    if (!user) {
      throw new UnauthorizedError();
    }

    // 4. Если все прошло успешно - передать запись пользователя и токен в req
    // и передать обработку запроса на следующий middleware
    req.user = user;
    req.token = token;

    next();
  } catch (err) {
    next(err);
  }
}

Last updated