Неожиданно отсутствует JWT httpOnly cook ie в заголовке запроса - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю на веб-сайте, который использует 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...