#node.js #express #cookies #jwt
#node.js #экспресс #файлы cookie #jwt
Вопрос:
итак, я немного запутался в правильном способе передачи авторизации JWT, я знаю, что общий подход заключается в том, что вы можете использовать заголовок авторизации для его проверки, что-то вроде этого:
const verifyToken = (req, res, next) => {
const authHeader = req.headers.token;
if (authHeader) {
const token = authHeader.split(" ")[1];
jwt.verify(token, process.env.JWT_KEY, (err, user) => {
if (err) {
res.status(403).json("Token is not valid!");
}
req.user = user;
next();
});
} else {
res.status(401).json("You're not authenticated");
}
};
Однако, если я использовал cookie для хранения своего токена JWT после входа в систему, например:
res.cookie("accessToken", accessToken, { httpOnly: true });
res.cookie("refreshToken", refreshToken, { httpOnly: true });
Означает ли это, что я могу игнорировать указанный выше authHeader и использовать непосредственно из файла cookie для проверки моего токена? Что-то вроде:
const verifyToken = (req, res, next) => {
//USING TOKEN FROM COOKIES
const accessToken = req.cookies.accessToken;
const refreshToken = req.cookies.refreshToken;
if (accessToken amp;amp; refreshToken) {
jwt.verify(accessToken, process.env.JWT_KEY, (err, user) => {
if (err) {
res.status(403).json("Token is not valid!");
}
req.user = user;
next();
});
} else {
res.status(401).json("You're not authenticated");
}
};
Спасибо за любые разъяснения
Ответ №1:
Я думаю, что хранить токены в виде файлов cookie напрямую — плохая практика, поскольку любой, кто имеет доступ к компьютеру, может получить к ним доступ. Файлы cookie не защищены, когда они хранятся в браузере.
Простая установка HttpOnly также является плохой практикой, вы также должны установить атрибут Secure и SameSite для файлов cookie, чтобы сделать их более безопасными. Еще лучше зашифровать их, прежде чем хранить внутри файла cookie.
Лучшим подходом может быть рассмотрение шаблона BFF, как описано здесь
Комментарии:
1. Привет, как насчет того, чтобы я сохранил accessToken в памяти, чтобы клиент мог установить его в качестве заголовка авторизации и сохранить refreshToken в файле cookie HttpOnly, поэтому, хотя мой accessToken открыт, он недолговечен, это лучший подход? Потому что я не могу найти какую-либо реализацию для шаблона BFF в коде, спасибо
2. Проблема в том, что если вы используете стандартный поставщик авторизации OpenID Connect / OAuth, то вам нужно вызвать его, используя токен обновления в запросе API, поэтому ваш JavaScript по-прежнему должен иметь доступ к обоим токенам. Если вы все еще хотите использовать токены в браузере, рассмотрите возможность использования библиотеки, подобной github.com/openid/AppAuth-JS