Привет ТАК,
Мой сервер использует Node.js и Express. Я правильно настроил cookie-parser
и body-parser
и большую часть времени могу получать и отправлять файлы cookie.
Итак, мое приложение на самом деле очень простое.
- Представлена страница входа.
- Ajax-запрос к
seslogin
с idToken and csrfToken
.
- Бэкэнд получает эти токены, и может читать куки с
req
.
- Создает сеансовый cookie и отправляет его клиенту.
- Клиент перенаправляет на
/profile
с window.location.assign('profile')
- Обычно бэкэнд читает сессионный cookie, проверяет его и представляет пользовательский интерфейс.
В моем app.ts я могу отлично получать куки в этой части. Я звоню seslogin
с Ajax-запросом на мой клиентский скрипт.
app.post('/seslogin', function (req, res) {
const idToken = req.body.idToken.toString();
const csrfToken = req.body.csrfToken.toString();
console.info('[SESLOGIN] Cookies: ', req.cookies);
console.info('[SESLOGIN] Session Cookie: ', req.cookies.session);
if (!req.cookies || csrfToken !== req.cookies.csrfToken) {
res.status(401).send('UNAUTHORIZED REQUEST!');
return;
}
const expiresIn = 60 * 60 * 24 * 5 * 1000;
if (new Date().getTime() / 1000 - decodedClaims.auth_time < 5 * 60) {
return admin.auth().createSessionCookie(idToken, { expiresIn: expiresIn });
}
throw new Error('UNAUTHORIZED REQUEST!');
})
.then(function (sessionCookie) {
const options = { maxAge: expiresIn, httpOnly: true, secure: true };
res.cookie('session', sessionCookie, options);
res.end(JSON.stringify({ status: 'success' }));
})
.catch(function (error) {
res.status(401).send('UNAUTHORIZED REQUEST!');
});
});
Тем не менее, очень интересно, что в этой части куки не определены
app.get('/profile', function (req, res) {
// Get session cookie.
const sessionCookie = req.cookies.session || '';
console.info('[PROFILE] Cookies: ', req.cookies);
console.info('[PROFILE] Session Cookie: ', req.cookies.session);
admin.auth().verifySessionCookie(sessionCookie, true)
.then(function (decodedClaims) {
// Serve content for signed in user.
return serveContentForUser('/profile', req, res, decodedClaims);
}).catch(function (error) {
// Force user to login.
console.error(new Error(error));
//res.redirect('/login');
res.redirect('/');
});
});
client.js (Запрос)
firebase.auth().onAuthStateChanged(function (user) {
user.getIdToken().then(function (idToken) {
var csrfToken = getCookie('csrfToken')
return postIdTokenToSessionLogin('/seslogin', idToken, csrfToken)
.then(function () {
// Redirect to profile on success.
window.location.assign('/profile');
}, function (error) {
console.log(error);
window.location.assign('/login');
});
});
});
/ заголовки запроса профиля (на Chrome)