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

Необходимость в проверке прав пользователя на выполнение определенных действий (прав на обращение в [ендпоинтам](https://reloaderlev.gitbook.io/russian-goit-node-js-new-program/express.js/chto-takoe-endpoint)) с помощью токена возникает очень часто. Поэтому для этого обычно создается отдельный middleware.

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

* извлекает токен (с заголовка "Authorization" или кукис)
* если токена нет или токен не было найдено в нашей БД - отвечает пользователю с ошибкой 401&#x20;
* если у пользователя, что соответствует данному токена, не хватает прав на выполнение заданного запроса - отвечает пользователю с ошибкой 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);
  }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://reloaderlev.gitbook.io/russian-goit-node-js-new-program/autentifikaciya-and-avtorizaciya/middleware-dlya-avtorizacii.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
