如果用户未在Firebase中登录,如何重定向

时间:2016-12-21 20:02:58

标签: javascript firebase firebase-authentication

我有一个我认为以前没有回答的问题。我目前在Firebase中寻找类似于PHP会话的内容。

你看,当我退出我的网络应用程序时,用户将被重定向回登录页面。但是,他们仍然可以输入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触发是有意义的,意识到用户没有登录,重定向,对吧?有任何想法吗?谢谢大家!

3 个答案:

答案 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>
    )
}
相关问题