2016-12-21 24 views
1

私は以前に答えられたとは思わない質問があります。私は現在、PHPセッションに似たFirebaseのものを探しています。ユーザがFirebaseにログインしていない場合のリダイレクト方法

ウェブアプリケーションからログアウトすると、ユーザーはログインページにリダイレクトされます。しかし、彼らはhome.htmlのようなダイレクトURLを入力してログイン画面をバイパスすることができます。

ページが読み込まれたときにonAuthStateChangedが呼び出されている場合、どうなるかと思います。セッションのように、彼らがすぐにリダイレクトされるのは意味があります。残念ながら、彼らはそうではありません。

これは、ロード時にlogin.htmldashboard.htmlが呼び出されるコードです。誰もこの問題を引き起こす可能性のある間違いを見つけられますか?ありがとう!ここで

App.js

(function(){ 
const config ={ 
apiKey: " :) ", 
authDomain: " :)", 
databaseURL: " :) ", 
storageBucket: " :)", 
messagingSenderId: ":)" 
}; 
firebase.initializeApp(config); 
    //Grab Login Elements 
const loginBtn = document.getElementById('sign-in-btn'); 
const emailTxt = document.getElementById('user-email'); 
const passTxt = document.getElementById('user-password'); 


//Set the click event to sign the user in 
loginBtn.addEventListener('click', e => { 
const email = emailTxt.value; 
const password = passTxt.value; 
const auth = firebase.auth(); 
//Actually Sign In 
const promise = auth.signInWithEmailAndPassword(email, password); 
promise.catch(e=> console.log(e.message)); 
}); 
//Realtime Authstate Listener 

firebase.auth().onAuthStateChanged(firebaseUser => { 
    if(firebaseUser){ 
     window.location = 'dashboard.html' 
    }else{ 
     window.location = 'login.html' 
    } 
}); 
}()); 

onAuthStateChangedは、火災、ユーザーがログインしていないことを認識し、リダイレクトすることは理にかなってdashboard.html

<!DOCTYPE html> 
<html> 
<head> 
<title>My App</title> 
<link rel="stylesheet" type="text/css" href="styles/dashboardstyle.css"> 
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script> 
<body> 
<script type="text/javascript" src="scripts/app.js"></script> 
<script type="text/javascript" src="scripts/dashboard.js"></script> 
</body> 
</html> 

の重要な部分です、 右?何か案は?皆さんありがとう!

答えて

1

オリジナルのtrue部分にネストされたif statementを作成してこの問題を解決しました。この新しいifの文では、ユーザーの場所を確認し、ログインページにあった場合は、既存のコードを使用してリダイレクトされました。私はまた、ユーザの他の場所を確認するためにここにelse if節を持っていました。たとえば、ユーザーがprofile.htmlという名前のページにあり、そのユーザーが存在する場合、それらをリダイレクトする必要はありません。これはコードを使用してチェックされました

else if(window.location.href == 'http://website.com/profile.html`){ 
/*then do nothing, no need to be redirected because the user exists, as they 
are within a permitted page */ 
    } 

これは私の問題を解決しました。

0

これは非常に良い質問です。インフラストラクチャの設定方法によって異なります。

あなたはFirebaseリアルタイムデータベースを使用している場合は、リソースへのアクセスを制限し、各ページにonAuthStateChangedリスナーを使用して、ユーザーが署名されていないときにサインインするためにリダイレクトするようにfirebaseルールを使用することができます。

の場合独自のバックエンドを使用しています。ログインすると、独自のセッションCookieが保存されます。最も簡単なことは、firebase idトークン(getToken)を保存することです。トークンが1時間ごとに期限切れになり、セッションクッキーをリフレッシュするたびに、毎時間これをリフレッシュする必要があります(getToken(true))。あなたのバックエンドでは、制限されたリソースを提供する前にadmin node.jsライブラリを使用してIDトークンを確認し、ログインしていなければログインページにリダイレクトすることができます。 これは何とか問題の単純化ですが、あなたを正しい方向に導きます。 Firebaseチームにこの問題が通知され、それを調べています。

関連する問題