Как защитить роуты от незалогиненных пользователей и по ролям, если используется JWT?

На стороне сервера у меня есть 2 middleware - protect (залогинен?) и restrictTo (имеет соответствующую роль?), которые не позволяют выполнять некоторые действия, если у посетителя сайта нет на то прав
exports.protect = catchAsync(async (req, res, next) => {
	let token;

	if (
		req.headers.authorization && req.headers.authorization.startsWith("Bearer")
	) {
		token = req.headers.authorization.split(" ")[1];
	}

	if (!token) {
		return next(new AppError("Вы не вошли в систему!", 401));
	}

	const decodedToken = await promisify(jwt.verify)(
		token,
		process.env.JWT_SECRET
	);

	const currentUser = await User.findById(decodedToken.id);
	if (!currentUser) {
		return next(new AppError("Пользователя с таким токеном больше не существует"));
	}

	req.user = currentUser;
	next();
});


exports.restrictTo = (...roles) => {
	return (req, res, next) => {
		if (!roles.includes(req.user.role)) {
			return next(new AppError("Нет прав для выполнения этого действия", 403));
		}
		next();
	};
};


Но как защитить роуты на стороне клиента? Чтобы я не мог перейти на страницу добавления новой записи, если я не вошел в систему, например? Куки, в которых хранится токен, имеют флаг httpOnly. Это, насколько я понимаю, не даст мне посмотреть токен прямо из Vue router. Хранить в Vuex? Но как тогда синхронизировать состояние токена в куки и в state?
Сделать в beforeEach у Vue router запрос на определенный эндпоинт, который в ответ будет говорить, могу ли я перейти на роут или нет?
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы