gpt4 book ai didi

javascript - 使用 Firebase/Authentication 控制对网页的访问

转载 作者:行者123 更新时间:2023-12-01 01:31:46 27 4
gpt4 key购买 nike

我在 Javascript 中使用 Firebase 身份验证(使用基于密码的帐户)时遇到问题。

我遵循了这个文档: https://firebase.google.com/docs/auth/web/password-auth一切都按我的预期进行。

这是我的配置以及我遇到问题的地方。

我有一个主网页(称为 M.html),需要登录才能访问。

我有一个登录页面(称为L.html),它是访问主页的门户。

当用户进入登录页面时,他需要输入凭据才能进一步操作。如果他登录,他应该访问主页。

如果用户尝试直接进入主页,则会执行检查以查看其登录状态。如果他已登录,一切都应该没问题,如果他没有登录,他应该被迫返回登录页面。

但是发生的情况是,主页永远不会检测到用户已登录,并且总是将他带回到登录页面。

我需要知道要遵循的程序,以使主页知道登录页面已接受登录。

我在代码中尝试了各种选项,但没有成功。我还读到我可能必须使用 firebase.auth().getRedirectResult().then....但没有找到任何方法让它发挥应有的作用。

为了让事情变得清楚,我制作了主登录页面的简化版本。下面是两者的代码。我希望有人可以轻松地看到我应该在哪里更改代码以获得我想要的行为。

M.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://cdn.firebase.com/js/client/2.4.2/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.5.7/firebase.js"></script>
</head>

<body>
<div id="mainPage"></div>

<script>
// Initialize Firebase.
var config = {
apiKey: "myyKeyyy",
authDomain: "......firebaseapp.com",
databaseURL: "https://......firebaseio.com",
projectId: "....",
storageBucket: "........appspot.com",
messagingSenderId: "........."
},
app = firebase.initializeApp(config);
</script>

<script>
function checkUser() {
let user = firebase.auth().currentUser;

if (user) {setMainPage();}
else {window.open("http://.../L.html",'_self');}
}


function setMainPage() {
let label = document.getElementById("mainPage");
label.innerHTML = "<h1>This is the main page!</h1><br/>";
label.innerHTML += "<h1>I can be here because I am logged in !!</h1>";
}

//setMainPage(); // This would show the contents without checking that a user is logged in.
checkUser();

</script>
</body>
</html>

L.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://cdn.firebase.com/js/client/2.4.2/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.5.7/firebase.js"></script>
</head>

<body>
<script>
// Initialize Firebase.
var config = {
apiKey: "myyKeyyy",
authDomain: "......firebaseapp.com",
databaseURL: "https://......firebaseio.com",
projectId: "....",
storageBucket: "........appspot.com",
messagingSenderId: "........."
},
app = firebase.initializeApp(config);
</script>

<script>

firebase.auth().signOut().then(function() {
// Sign-out successful.
console.log("Sign-out successful.");

firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
window.open("http://.../M.html",'_self');
}
});

}).catch(function(error) {
// An error happened.
console.log("Sign-out error.");
});


function LogInProcess() {
let theEmail = document.getElementById("EmlAdr").value.trim(),
thePassword = document.getElementById("PsWd").value;

firebase.auth().signInWithEmailAndPassword(theEmail,thePassword).catch(function (error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
console.log("errorCode: " + errorCode);
console.log("errorMessage: " + errorMessage);
// ...
});
}
</script>

Email address: <input type='text' name='EmlAdr' id='EmlAdr' value=''><br/><br/>
Password: <input type='password' name='PsWd' id='PsWd' value=''><br/><br/>
<input type='button' id='LgIn' style='font-size:20px' value='Log In' onClick='LogInProcess()'><br/>

</body>
</html>

最佳答案

您希望使用 onAuthStateChanged 观察者来检查用户是否已登录。否则您通常会得到处于不完整状态的 auth 对象。查看最新文档here .

将您的 checkUser 函数替换为:

firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// show your main content
} else {
// redirect to login
}
})

一旦 Firebase 应用完全初始化,这将触发,并且如果用户已成功登录,您应该拥有一个用户。

关于javascript - 使用 Firebase/Authentication 控制对网页的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53220698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com