Я работаю на веб-сайте, который использует JWT, сохраненный как httpOnly cook ie, чтобы разрешить пользователю использовать ресурсы на серверной части. В проекте используется узел / express на стороне сервера с настройкой микросервиса, использующей docker и контейнер балансировки нагрузки для обработки маршрутизации.
Система работает и при входе в систему JWT httpOnly cook ie отправляется обратно в заголовок ответа. Это прекрасно работает, когда я делаю запрос на выборку. Делает его на сервер, проверяет и отправляет обратно, без проблем.
Эта система может делать повторные запросы, когда повар ie большую часть времени отправляется с запросом. «Большая часть времени» - это проблема. Иногда я случайно выхожу из системы через пару минут, а иногда и через 30 минут. Проверяя вкладку «Сеть» в инструментах Chrom dev, я вижу, когда происходит случайный выход из системы, мой запрос не отправляет cook ie в заголовок запроса, почти как если бы он истек. Я установил срок действия до часа и даже попытался установить его на false, но не повезло.
Пример рабочего запроса:
\*REQUEST HEADER*\
GET /users/validate/ HTTP/1.1
Host: localhost
Connection: keep-alive
Sec-Fetch-Dest: empty
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36
DNT: 1
Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: http://localhost/dashboard.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: PARTICLES=false; pma_lang=en; phpMyAdmin=43d69b07fdb6561641d95e048de4415e; authorization=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJRCI6NjUsInVzZXJuYW1lIjoiQWRtaW4iLCJmaXJzdE5hbWUiOiJBZG1pbiIsImxhc3ROYW1lIjoiQWRtaW4iLCJhbGdvcml0aG0iOiJIUzI1NiIsImlhdCI6MTU4NTg0NDQ3MSwiZXhwIjoxNTg5NDQ0NDcxfQ.2-SfGq3sGnaRUpqAPPZ_YBRlybnYLWzErFdvhdUlTeA
\*RESPONSE HEADER*\
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 02 Apr 2020 16:31:20 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 479
Connection: keep-alive
X-Powered-By: Express
Vary: Origin
Access-Control-Allow-Credentials: true
Set-Cookie: authorization=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: authorization=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJRCI6NjUsInVzZXJuYW1lIjoiQWRtaW4iLCJmaXJzdE5hbWUiOiJBZG1pbiIsImxhc3ROYW1lIjoiQWRtaW4iLCJhbGdvcml0aG0iOiJIUzI1NiIsImlhdCI6MTU4NTg0NDQ3MSwiZXhwIjoxNTg5NDQ0NDcxfQ.2-SfGq3sGnaRUpqAPPZ_YBRlybnYLWzErFdvhdUlTeA; Path=/; HttpOnly
Самый следующий запрос после того, как он сработал. Повар ie отсутствует:
\*REQUEST HEADER*\
GET /users/validate/ HTTP/1.1
Host: localhost
Connection: keep-alive
Sec-Fetch-Dest: empty
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36
DNT: 1
Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: http://localhost/dashboard.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: PARTICLES=false; pma_lang=en; phpMyAdmin=43d69b07fdb6561641d95e048de4415e
Вот код, в котором я установил повара ie:
//verify that the user has the correct permissions
jwt.verify(token, config.secret.jwt, function(err, decoded) {
if (decoded) {
//if verified, then create new token and send.
res.locals.decodedToken = decoded;
res.clearCookie("authorization");
res.cookie("authorization", jwt.sign(decoded, config.secret.jwt), {
expires: false,
httpOnly: true
});
next();
} else {
console.error(err);
res.sendStatus(401);
}
});
Вот пример запроса на выборку со стороны клиента :
async getUserInfo() {
let post_url = "/users/validate/";
await fetch(post_url, {
method: "GET",
credentials: "include"
})
.then(response => response.json())
.then(response => {
/*Do stuff*/
})
.catch(error => console.error("error:", error));
Сайт делает несколько запросов, используя повар авторизации ie в зависимости от страницы, поэтому я попытался одновременно выполнить эти маршруты, чтобы увидеть, есть ли проблемы с расой, но пока Я не смог точно воспроизвести или точно определить, когда происходит эта проблема.
Я схожу с ума, пытаясь отладить эту проблему, поэтому мне нужна помощь в поиске лучшего способа отладки, кроме безнадежного нажатия на мою панель инструментов сайта, глядя на вкладку сети инструментов chrome dev.