我遵循了Stack Overflow - How to redirect after a user signs in with Firebase authentication?的指示

index.html:

<!DOCTYPE html>

<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>My auth page</title>
  <script defer src="/__/firebase/7.5.0/firebase-app.js"></script>
  <script defer src="/__/firebase/7.5.0/firebase-auth.js"></script>
  <script defer src="/__/firebase/7.5.0/firebase-database.js"></script>
  <script defer src="/__/firebase/init.js"></script>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <!-- My html code -->
  <script type="text/javascript" defer src="auth.js"></script>
</body>

</html>


auth.js:

function toggleSignIn() {
    if (firebase.auth().currentUser) {
        firebase.auth().signOut();
    } else {
        var email = document.getElementById('email').value;
        var password = document.getElementById('password').value;
        if (email.length < 4) {
            alert('Please enter an email address.');
            return;
        }
        if (password.length < 4) {
            alert('Please enter a password.');
            return;
        }
        firebase.auth().signInWithEmailAndPassword(email, password).catch(function (error) {
            var errorCode = error.code;
            var errorMessage = error.message;
            if (errorCode === 'auth/wrong-password') {
                alert('Wrong password.');
            } else {
                alert(errorMessage);
            }
            console.log(error);
        });
    }
}

function initApp() {
    console.log('start initApp');
    firebase.auth().onAuthStateChanged(function (user) {
        if (user) {
            console.log('logged in');
            window.location = 'admin-console.html';
        } else {
            console.log('not logged in');
            window.location = 'index.html'; //causes endless loop
        }
    });
    document.getElementById('loginbutton').addEventListener('click', toggleSignIn, false);
}

window.onload = function () {
    console.log('initialize app');
    initApp();
};


我可以看到这段代码无休止地循环。但是我看不到我从指令中错过的东西。看来,此说明应该起作用。

最佳答案

调用signInWithEmailAndPassword()方法并成功后,该用户将登录。因此,如果我正确理解您的功能要求,则无需使用onAuthStateChanged()

您可以按照以下方式进行操作:

function login() {
    var email = document.getElementById('email').value;
    var password = document.getElementById('password').value;
    if (email.length < 4) {
        alert('Please enter an email address.');
        return;
    }
    if (password.length < 4) {
        alert('Please enter a password.');
        return;
    }

    firebase.auth().signInWithEmailAndPassword(email, password)
    .then(userCredential => {
       console.log("User " + userCredential.user.uid + " LOGGED IN");
       window.location = 'admin-console.html';
    })
    .catch(function (error) {
            var errorCode = error.code;
            var errorMessage = error.message;
            if (errorCode === 'auth/wrong-password') {
                alert('Wrong password.');
            } else {
                alert(errorMessage);
            }
            console.log(error);
            //Throw an error
        });
}

function logout() {
    firebase.auth().signOut()
    .then(() => {
       console.log("User SIGNED OUT");
       window.location = 'index.html';';
    })
}

function initApp() {
    console.log('start initApp');
    document.getElementById('loginbutton').addEventListener('click', login, false);
    document.getElementById('logoutbutton').addEventListener('click', logout, false);
}

window.onload = function () {
    console.log('initialize app');
    initApp();
};




请注意,您需要添加一个logoutbutton按钮。如果您只想要一个切换按钮(而不是一个loginbutton按钮加一个logoutbutton按钮),则可以轻松地修改上面的代码。

10-07 17:39