Всякий раз, когда я визуализую домашнюю страницу или страницу учетной записи, моя сессия иногда теряется. У меня есть функция, называемая isSignedIn()
, которая проверяет, существует ли uid. Иногда, когда я обновляю домашнюю страницу, он возвращает false. Когда я попал в конечную точку моей учетной записи, он также возвращает false, даже если это правда на предыдущей странице. Любые идеи о том, почему это происходит?Firebase Authenticatoin - onAuthStateChanged, вызываемый несколько раз
Как работает мое приложение: Когда пользователь входит в систему, я беру uid с клиентской стороны и ударяю конечную точку auth.
function createServerSession(user) {
// Get secret token from Firebase for current session
firebase.auth().currentUser.getToken(true)
.then(function(idToken) {
// Get session on my Node server for server user identification
if (idToken) {
fetch('/firebaseauth?idtoken=' + encodeURIComponent(idToken) + '&username=' + encodeURIComponent(user.email.split('@')[0]), {
credentials:'include'
}).then(function(data){
if (window.location.pathname === '/' && document.getElementById('login').innerHTML.trim() === 'Join') {
redirect('/');
}
if (window.location.href.includes('login')) {
redirect('/');
}
})
}
})
}
Затем она попадает мой Node.js код для хранения сессии:
app.get('/firebaseauth', function (req, res) {
if (! req.session.idToken) {
firebase.auth().verifyIdToken(req.query.idtoken).then(function(decodedToken) {
req.session.username = req.query.username
req.session.idToken = decodedToken.uid;
req.session.save(function(){
res.json(true)
})
})
Этот подход отлично работает большую часть времени, но некоторые случаи он будет посылать несколько запросов. Самая высокая сумма составляет 7400 в одной точке. Любые рекомендации приветствуются.
Не совсем уверен, как вы это используете, но я рекомендую вам вызвать firebase.auth(). CurrentUser.getToken() без принудительного обновления. В вашем коде может быть несколько циклов. Вызов getToken с помощью true приведет к обновлению токена id. Это также вызовет onAuthStateChanged. Вы можете снова вызвать свою рутину, которая вызывает бесконечный цикл. – bojeil
После публикации этой проблемы я переключил хосты с GAE на Heroku и исправил их. Я знаю, что функциональность с node.js находится в бета-версии, так что, возможно, именно так. – SwagJunkie