Я создаю веб-приложение, доступ к которому имеют только зарегистрированные пользователи.Я использую JWT для создания безопасного токена.Когда пользователь делает новый запрос (например, непосредственно вводит в адресной строке или открывает браузер), так как запрос не отправляется с заголовком авторизации, я создал скрипт для перенаправления на временную страницу, которая будет извлекать сохраненный токен из локальногохранилище (если существует) и снова отправьте исходный запрос с заголовком авторизации.
Однако, когда я делаю это, запрос работает (запрос на отправку отправляется на исходную страницу, содержащую правильный заголовок авторизации),но поскольку window.location не обновляется, страница не отображается на стороне клиента (хотя она была на стороне сервера).И когда я добавляю строку 'window.location.replace ()', чтобы обновить ее, он отправляет новый запрос Get, но на этот раз без заголовка авторизации.
Дизайн работает следующим образом: когда запрос getотправляется на любую защищенную страницу, она проверит, имеет ли req заголовок авторизации.Если нет, он перенаправляет на специальную страницу, которая будет отображать только javascript на стороне клиента, чтобы проверить, хранится ли локальный токен локально.Этот скрипт будет публиковать на той же странице, и если токен был найден, он вернется к исходному запросу при отправке заголовка авторизации.В противном случае он отображает страницу ошибки «403.»
Как уже говорилось, программа прекрасно работает, когда отправляет заголовок авторизации в исходный запрос.Проблема в том, что на стороне клиента происходит рендеринг.
Мне нужно обновить расположение окна клиента, чтобы получить результат рендеринга.Я пробовал альтернативы window.location (который не отправляет заголовок), например, создание XMLHttp-запроса или запроса на выборку (у меня есть chrome 75 с реализованным fetch api), а также AJAX.Но никто из них не будет обновлять местоположение: они на самом деле отправляют заголовки довольно хорошо, но мне все равно нужно вызвать window.location.replace (), как только они закончатся.
Вот код на стороне сервера:
// Post method
app.post('/redirect', (req, res) => {
// Client should send an authorization header and it shouldn't be null
// localStorage returns null if nothing found
if(
req.headers['authorization'] !== undefined &&
req.headers['authorization'] !== null
) {
// Another server-side method I tried
//res.location(req.session.last);
//res.sendStatus(302).end();
res.redirect(req.session.last);
} else {
res.redirect('/' + req.session.lang + '/error/403');
}
});
// Get method
app.get('/redirect', (req, res) => {
if(
req.session.last !== undefined &&
typeof req.session.last === 'string'
) {
res.render('loader', {
scripts: frontScripts
});
} else {
res.redirect('/' + req.session.lang + '/error/404');
}
});
Где я использую req.session для хранения информации оригинального запроса.
А вот код на стороне клиента:
const access = () => {
const token = localStorage.getItem('anov_auth_token');
const fetchInit = {
method: 'POST',
headers: {
'authorization': token
},
mode: 'cors',
redirect: 'follow'
};
const fetchReq = new Request('http://localhost:8080/redirect');
fetch(fetchReq, fetchInit);
// window.location.replace('http://localhost:8080/' + dest);
// this line I don't want since it makes a new request
// dest was a variable I sent from back to retrieve original query
};
window.onload = () => {
access();
};
Я сделал console.log () в моем исходном запросе, в котором записан правильный токен:
undefined
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7fSwiaWF0IjoxNTU4MTg2NDMwfQ.dq0M8fY2Azk_7KBnOpki40tj1y2W4QtLoPNrSj8EsH8
с неопределенной ссылкой на первый запрос (без заголовков).Теперь я хочу, чтобы мой клиент обработал исходный запрос.
Спасибо за любую помощь!