Я пытаюсь назначить сессионный cookie в обмен на предоставленный токен ID. Здесь - документы, за которыми я следую.
Вот мой код входа на стороне клиента:
firebase.auth().signInWithEmailAndPassword(email, password)
.then(function(user) {
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
return sendToken(idToken);
});
})
// .then(() => {
// return firebase.auth().signOut();
// })
.then(() => {
window.location.assign('/member');
})
.catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
alert(errorMessage);
});
Мой send sendToken () отправляет idToken насервер:
function sendToken(idToken) {
console.log("Posting " + idToken);
var xhr = new XMLHttpRequest();
var params = `token=${idToken}`;
xhr.open('POST', "/login", true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
return new Promise(function(resolve, reject) {
xhr.onreadystatechange = function() {//Call a function when the state changes.
if (xhr.readyState == 4 && xhr.status == 200) {
resolve();
} else if (xhr.readyState == 4 && xhr.status != 200) {
reject("Invalid http return status");
}
}
return xhr.send(params);
});
}
И на сервере я возвращаю cookie сеанса:
app.post('/login', (req, res) => {
if (req.body.token) {
const idToken = req.body.token.toString();
// Set session expiration to 1 day.
const expiresIn = 60 * 60 * 24 * 1 * 1000;
return firebase.auth().createSessionCookie(idToken, {expiresIn}).then((sessionCookie) => {
const options = {maxAge: expiresIn, httpOnly: true, secure: true};
res.cookie('session', sessionCookie, options);
res.end(JSON.stringify({status: 'success'}));
})
.catch((error) => {
res.status(401).send('UNAUTHORIZED REQUEST!');
});
}
return res.status(400).send("MISSING TOKEN");
});
Я также установил промежуточное программное обеспечение для проверки cookie сеанса до того, как сервер будет работатьинформация об участнике:
function authVerification(req, res, next){
const sessionCookie = req.cookies.session || '';
// Verify the session cookie. In this case an additional check is added to
detect
// if the user's Firebase session was revoked, user deleted/disabled, etc.
return firebase.auth().verifySessionCookie(
sessionCookie, true /** checkRevoked */).then((decodedClaims) => {
console.log("decoded claims: " + decodedClaims);
next();
// serveContentForUser('/profile', req, res, decodedClaims);
}).catch(error => {
// Session cookie is unavailable or invalid. Force user to login.
res.send(error);
});
}
Но, когда я пытаюсь получить страницу участника после входа в систему:
app.get("/member", authVerification, (req, res) => {
res.send("member page");
});
Я получаю сообщение об ошибке от authVerification:
код: «auth / arguments-error», сообщение: «Не удалось расшифровать файл cookie сеанса Firebase. Убедитесь, что вы передали всю строку JWT, которая представляет файл cookie сеанса. Подробную информацию о том, как извлечь файл cookie сеанса, см. https://firebase.google.com/docs/auth/admin/manage-cookies».
Может кто-нибудь, пожалуйста, укажите мне в правильном направлении.Заранее спасибо!