我有一个我认为以前没有回答的问题。我目前在Firebase中寻找类似于PHP会话的内容。
你看,当我退出我的网络应用程序时,用户将被重定向回登录页面。但是,他们仍然可以输入home.html
等直接网址,并绕过登录屏幕。
我想知道如果在页面加载时调用onAuthStateChanged
会发生这种情况。将它们立即重定向是有意义的,类似于会话。不幸的是,他们不是。
这是login.html
和dashboard.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
触发是有意义的,意识到用户没有登录,重定向,对吧?有任何想法吗?谢谢大家!
答案 0 :(得分:1)
这是一个非常好的问题。这取决于您的基础架构的设置方式。
如果您使用的是Firebase实时数据库,则可以使用firebase规则限制对资源的访问,并在每个页面上使用onAuthStateChanged侦听器,并在用户未登录时重定向以登录。
如果您使用自己的后端,登录时,您将保存自己的会话cookie。最简单的方法是保存firebase id标记(getToken)。您需要每小时保持刷新一次(getToken(true)),因为令牌每小时到期并刷新会话cookie。在后端,您可以使用admin node.js库在提供受限资源之前验证id令牌,如果用户未登录,则可以重定向到登录页面。 我意识到这在某种程度上是问题的简化,但应该引导你朝着正确的方向前进。 Firebase团队已收到此问题的通知,并正在调查此问题。
答案 1 :(得分:1)
我通过在原始版本的if statement
部分内创建嵌套true
来解决此问题。在这个新的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 */
}
这解决了我的问题。
答案 2 :(得分:0)
import React from 'react'
import { Route, Redirect } from 'react-router-dom'
import { useAuth } from '../contexts/AuthContext'
export default function PrivateRoute({ component: Component, ...rest }) {
const { currentUser } = useAuth()
return (
<Route
{...rest}
render={props => {
return currentUser ? <Component {...props} /> : <Redirect to='/login' />
}}
></Route>
)
}