Таким образом, у нас возникает случайная проблема, когда время от времени токен JWT, который мы храним в куки для аутентификации, не устанавливается в браузере. Теперь 99% времени, когда пользователь заходит на веб-страницу входа в систему, вводит свои данные, он отправляет запрос на сервер, который отправляет обратно свои данные пользователя и токен JWT, установленный в файлах cookie. Время от времени повар ie, похоже, не настроен. Его случайность произошла почти во всех браузерах, но без причины. Это происходит как в нашей локальной, промежуточной и производственной среде. (Я удалил некоторый код по соображениям конфиденциальности)
Внутренняя служба аутентификации создается с использованием Node, а ExpressJS устанавливает токен со следующим кодом:
module.exports.signIn = async function(req, res, next) {
try {
const { email, password } = req.body;
if (!email || !password)
throwBadRequest("Please enter a valid email and password");
const data = await Users.get(`?email=${email.toLowerCase().trim()}`);
const { name, val, options } = await Token.generateCookieParams(data);
res.cookie(name, val, options);
return res.json(toDTO(data));
} catch (err) {
next(err)
}
};
Мы используете парсер middleware cook ie, если это поможет. Вот код, который устанавливает токен:
async function generateFor(user, expireTime, special = null) {
const payload = { id: user._id, type: user.type, account: user.account };
if (user.entity) {
payload.entity = user.entity;
}
if (special) {
payload.special = special;
}
const token = await jwt.sign(payload, config.secret, {
expiresIn: expireTime
});
return token;
}
async function generateCookieParams(user) {
const expireTime = 60 * 60 * 12; // 12 hour
const token = await Token.generateFor(user, expireTime);
return { name: config.tokenKey, val: token, options: { httpOnly: true } };
}
Мы используем промежуточное программное обеспечение для управления ядрами в приложении express, и для учетных данных опции установлено значение true.
Затем в внешний интерфейс, мы используем superagent для выполнения всех запросов из приложения реагировать, мы также использовали Ax ios, но у нас есть те же проблемы. Базовый код для сети выглядит следующим образом:
import superagent from "superagent";
const superagentManager = {};
/**
* POST
* @param {string} path => the path for the post request
* @param {object} data => the object you are posting in json format
*/
superagentManager.post = async (path, data) => {
return await superagent
.post(path)
.withCredentials()
.type("application/json")
.send(data);
};
/**
* GET
* @param {string} path => the path for the get request
*/
superagentManager.get = async path => {
return await superagent
.get(path)
.withCredentials()
.type("application/json");
};
/**
* PATCH
* @param {string} path => the path for the patch request
* @param {object} data => the object you are posting in json format
*/
superagentManager.patch = async (path, data) => {
return await superagent
.patch(path)
.withCredentials()
.type("application/json")
.send(data);
};
/**
* DELETE
* @param {string} path => the path for the delete request
*/
superagentManager.delete = async path => {
return await superagent
.delete(path)
.withCredentials()
.type("application/json");
};
export default superagentManager;
Если кто-нибудь может мне помочь, это будет очень цениться. Система работает, но время от времени, скажем, 1 из каждых 50 логинов не устанавливает токен в браузере. Таким образом, пользовательский объект возвращается из запроса на вход в систему, но дальнейший запрос, который происходит сразу после этого, выдает ошибку, так как в cook ie нет токена. С ростом пользовательской базы ошибка становится все более заметной.