我遵循了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
按钮),则可以轻松地修改上面的代码。