2016-12-21 48 views
1

我有一个问题,我不相信之前已经回答过。我目前正在寻找类似于PHP会话的Firebase内容。如果用户未在Firebase中登录,如何重定向

您会看到,当我退出我的网络应用程序时,用户将被重定向回登录页面,就像他们应该是的。但是,他们仍然可以输入直接网址,例如home.html,并绕过登录屏幕。

我想知道如何在页面加载时调用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' 
    } 
}); 
}()); 

这里是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> 

的重要组成部分这将是有意义的onAuthStateChanged火,实现用户没有登录和重定向, 对?有任何想法吗?谢谢大家!

回答

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

这是一个非常好的问题。这取决于您的基础设施如何建立。

如果您正在使用火力地堡实时数据库,你可以用火力规则来限制对资源的访问,并在每一页上使用onAuthStateChanged监听器,并重定向到登录时,用户没有登录。

如果您正在使用自己的后端,登录后,您将保存自己的会话cookie。最简单的做法是保存firebase id令牌(getToken)。随着令牌每小时过期并刷新会话cookie,您需要每小时继续刷新一次(getToken(true))。在您的后端,您可以使用admin node.js库在提供受限资源之前验证id令牌,并在用户未登录时重定向到登录页面。 我意识到这是某种方式简化了问题,但应该引导你在正确的方向。 Firebase团队已收到此问题的通知,并正在调查此问题。

相关问题