#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. в зависимости от предоставленной информации проблем быть не должно. если вы можете поделиться всем проектом, было бы лучше, чтобы мы могли его отладить.