私のSPA React/Firebaseアプリケーションのハードリフレッシュは、機能の即時実行時にauth状態を維持しません。私は回避策がありますが、それはスケッチです。firebase authがリフレッシュ時に遅れます
私の反応ルートはonEnter
機能を利用して、ユーザーが認証されているかどうかを判断します。例えば
<Route path="/secure" component={Dashboard} onEnter={requireAuth}/>
はさらに、私のrequireAuth
関数は次のようになります。
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 }
});
}
};
しかし、ハードリフレッシュにfirebase.auth().currentUser
に若干の遅延があります。これは最初はヌルです。次に、認証状態を判断するためにfirebaseサーバにPOST
を実行します。それが返されるときcurrentUser
オブジェクトが設定されます。この遅延は問題を引き起こします。
私のハックソリューションは以下の通りです:更新:これは実際には動作しません...
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);
};
は単にタイムアウトでそれをラップします。しかし、私は本当にこれが好きではない...任意の考えですか?
更新:
また、私は決定的な時間遅れとsetTimeout
よりも正確でなければなりませんonAuthStateChanged
リスナー、中でそれをラップしようとしています。
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);
};
2つのログ・ステートメントが実行されているが、反応-ルータreplace
を正しく実行されていないようです。コードは次のように。おそらく、それは反応ルータの専門家のための別の質問です。
アップデート2:私はこれに取り組んでいたとき
それは夜遅くでした。明らかにsetTimeout
は実際には機能しません。
私はちょうどここで似たような質問に答えたと思う:http://stackoverflow.com/questions/37370462/refs-not-rerunning-after-onauthstatechanged-changes-firebase-3-0-0 –
@FrankvanPuffelen私は実際に試したそんな感じ。 requireAuth関数のwrappの中からfirebase.auth()の内容をonAuthStateChanged(function(user){...});しかし、反応ルータの置換機能は、そのコンテキストでは何もしていないようです。私は質問を更新します。 –