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
Was this helpful?