NodeJS — Файл cookie на мгновение исчезает при обновлении

#javascript #node.js #authentication #cookies #session-cookies

Вопрос:

У меня есть эта проблема с моей аутентификацией, которая возникает только при обновлении. Мое промежуточное программное обеспечение для аутентификации выглядит следующим образом:

 const jwt = require('jsonwebtoken');
require("dotenv").config();
const express = require('express');

const verifyToken = (req, res, next) => {
    const {cookies} = req;
    if ('token' in cookies) {
        jwt.verify(cookies.token, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => {
            if (err) {
                console.log('COOKIE ERROR')
                res.redirect('/../notLoggedIn');
            }
            req.userId = decoded.user_id;
            next();
        });
    } else {
        console.log('NO VALID TOKEN')
        res.redirect('/../notLoggedIn');
    }
}


module.exports = verifyToken;
 

Это отлично работает при входе в маршруты, но если я уже нахожусь в authRoute, например «профиль», и обновлю страницу, я получу console.log «НЕТ ДОПУСТИМОГО ТОКЕНА». Но потом, когда я проверяю печенье, я вижу, что оно там есть. Мой единственный вывод заключается в том, что файл cookie исчезает на долю секунды при обновлении и запуске промежуточного программного обеспечения проверки подлинности, прежде чем файл cookie вернется.

Кто-нибудь знает, как это исправить?

Пс. Моя настройка для сеансов выглядит так:

 app.use(session({
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
        maxAge: 1000*60*30,
        //secure: true, //Only have true when deploying on https
        sameSite: true
    },
    rolling: true,
    httpOnly: true,
}));
 

Я пробовал использовать несколько конфигураций, но все еще не могу заставить его работать.

Редактировать:

Вот где я устанавливаю cookie при входе в систему

 router.post('/', async (req, res) => {
    const email = req.body.email;
    const password = req.body.password;

    await db.query(
    'SELECT * FROM users WHERE email = ?', [email], 
    (err, result) => {
        if (err) {
            res.send({err: err});
        }

        if (result.length > 0) {
            var date = new Date();
            date.setTime(date.getTime()   (30 * 60 * 60 * 1000));

            bcrypt.compare(password, result[0].password, (error, response) => {
                if (response) {
                    const user_id = result[0].id;
                    const email = result[0].email;
                    data = {
                        user_id,
                        email
                    }
                    jwt.sign(data, process.env.ACCESS_TOKEN_SECRET, (err, accessToken) => {
                        if(err){
                            res.send(err)
                        } else {
                            res.cookie('token', accessToken, {httpOnly: true, secret: process.env.SECRET, sameSite: true, maxAge: date}); //Set secure: true when deploying
                            res.send({auth: true})
                        }
                    });
                } else {
                    res.json({message: 'Wrong email/password combination', auth: false,});
                }
            });
        } else {
            res.send({message: 'User does not exist!', auth: false,});
        }
    });
});
 

Ответ №1:

Я думаю maxAge , что свойство в сеансе должно просто иметь 1000*60*30 вместо Date.now() 1000*60*30 .

Ссылка на документацию экспресс-сессии

Комментарии:

1. Это было то, что у меня было изначально, и это тоже не работает, я изменил его на Date.now (), потому что я прочитал в какой-то другой теме, что это может сработать.

Ответ №2:

Я думаю, что вы должны поделиться фрагментом кода, который содержит заданную логику файлов cookie. Это может быть проблемой

Комментарии:

1. Будет сделано, дай мне минутку!

2. Это должен быть комментарий, а не ответ.

3. Я обновил сообщение фрагментом своего маршрута входа в систему

4. @ThomasHirsch ты прав, мой друг^^, но я не могу написать комментарий из-за своей репутации

5. в зависимости от предоставленной информации проблем быть не должно. если вы можете поделиться всем проектом, было бы лучше, чтобы мы могли его отладить.