Hard Refreshes auf meinem SPA React/Firebase-Anwendung nicht auth Zustand bei sofortiger Ausführung einer Funktion. Ich habe einen Workaround, aber es ist skizzenhaft.firebase auth bei Aktualisierung verzögert
Meine Reaktionsrouten verwenden die onEnter
-Funktion, um festzustellen, ob der Benutzer authentifiziert ist oder nicht. Zum Beispiel
<Route path="/secure" component={Dashboard} onEnter={requireAuth}/>
Des Weiteren sieht meine requireAuth
Funktion wie folgt aus:
function (nextState, replace) {
console.log('requireAuth', firebase.auth().currentUser);
if (!firebase.auth().currentUser) {
console.log('attempting to access a secure route. please login first.');
replace({
pathname: '/login',
state: { nextPathname: nextState.location.pathname }
});
}
};
jedoch auf eine harte Refresh gibt es eine leichte Verzögerung auf firebase.auth().currentUser
. Es ist zuerst null und führt dann einen POST
zu Firebase-Servern aus, um den Auth-Status zu ermitteln. Bei der Rückgabe wird das Objekt currentUser
aufgefüllt. Diese Verzögerung verursacht jedoch Probleme.
Meine hacky Lösung ist folgende: Update: dies tatsächlich nicht funktioniert ...
function (nextState, replace) {
setTimeout(function() {
console.log('requireAuth', firebase.auth().currentUser);
if (!firebase.auth().currentUser) {
console.log('attempting to access a secure route. please login first.');
replace({
pathname: '/login',
state: { nextPathname: nextState.location.pathname }
});
}
}, 50);
};
einfach wickeln Sie es in einem Timeout. Allerdings mag ich das wirklich nicht ... irgendwelche Gedanken?
Update:
Ich habe auch versucht, es innerhalb eines onAuthStateChanged
Zuhörer zu setzen, das als ein setTimeout
mit einer endgültigen Zeitverzögerung genauer sein sollte. Code wie folgt:
function (nextState, replace) {
var unsubscribe = firebase.auth().onAuthStateChanged(function (user) {
if (!user) {
console.log('attempting to access a secure route');
replace({
pathname: '/login',
state: { nextPathname: nextState.location.pathname }
})
console.log('should have called replace');
}
unsubscribe();
});
// setTimeout(function() {
// console.log('requireAuth', firebase.auth().currentUser);
// if (!firebase.auth().currentUser) {
// console.log('attempting to access a secure route. please login first.');
// replace({
// pathname: '/login',
// state: { nextPathname: nextState.location.pathname }
// });
// }
// }, 50);
};
Die beiden Log-Anweisungen ausgeführt werden, reagieren aber-Router replace
scheint nicht korrekt ausgeführt werden. Vielleicht ist das eine andere Frage für die React-Router-Experten.
Update 2:
Es war spät in der Nacht, wenn ich daran gearbeitet wurde. Offensichtlich funktioniert setTimeout
auch nicht.
Ich glaube, ich antwortete nur eine ähnliche Frage hier: http://stackoverflow.com/questions/37370462/refs-not-rerunning-after-onauthstatechanged-changes-firebase-3-0-0 –
@FrankvanPuffelen ich tatsächlich versucht so ähnlich. Von der Funktion requireAuth wrapp den Inhalt in firebase.auth(). OnAuthStateChanged (function (user) {...}); Die Replace-Funktion von react-router scheint in diesem Kontext jedoch nichts zu tun. Ich werde die Frage aktualisieren. –