我有一个简单的自定义登录页面,使用firebase。基本上有一个管理页面,javascript正在检查当前用户是否经过身份验证。如果没有,它将被重定向到登录页面,在验证后将返回原始管理员。
这是检查身份验证的脚本:
<script type="text/javascript">
var ref = new Firebase("firebase.linkishere.com ?>");
var authData = ref.getAuth();
if (authData) {
console.log("User is authenticated!");
document.getElementById("container").style.display = "block";
} else {
var login = "login.php";
window.location.href = login;
console.log("I'm not authenticated;")
}
这是登录页面上的脚本:
$('#signIn').on("click", function (){
var username = $("#username").val();
var password = $("#password").val();
ref.authWithPassword({
email : username,
password : password
},
function(error, authData) {
if (error) {
switch (error.code) {
case "INVALID_EMAIL":
errorMessage.innerHTML = "The specified user account email is invalid."
console.log("The specified user account email is invalid.");
break;
case "INVALID_PASSWORD":
errorMessage.innerHTML = "The specified user account password is incorrect."
console.log("The specified user account password is incorrect.");
break;
case "INVALID_USER":
errorMessage.innerHTML = "The specified user account does not exist."
console.log("The specified user account does not exist.");
break;
default:
errorMessage.innerHTML = "Error logging user in"
console.log("Error logging user in:", error);
}
} else {
console.log("Authenticated successfully with payload:", authData);
window.location.href = "index.php";
remember: "sessionOnly"
}
});
});
所有这一切在chrome,firefox,microsoft edge上工作正常,但由于某些原因在Internet Explorer 11上,它不会保持身份验证。我输入我的详细信息,firebase接受它,然后它跳回到登录页面,带有控制台日志:我没有经过身份验证。
就像互联网资源管理器在页面刷新后或重定向后不会记住身份验证状态一样。
我错过了什么?
答案 0 :(得分:0)
嗯......我在运行IE 11的不同计算机上测试了相同的应用程序,运行正常。我猜我自己的电脑上有一个坏的咒语或什么的。 :(
答案 1 :(得分:0)
我在IE11中发现了同样的问题,由于某些原因,它似乎是浏览器和Firebase服务器之间的防火墙和代理服务器的问题。登录失败,出现A network error (such as timeout, interrupted connection or unreachable host) has occurred.
错误。奇怪的是,我可以毫无问题地连接到firebase的数据库端。在追踪问题时,IE甚至没有尝试与Google身份验证服务器进行通信。
在尝试了许多不同的选项之后,工作的那个(这有点像黑客)是在HTML页面上的HEAD标记之后放置一个<meta http-equiv="X-UA-Compatible" content="IE=10" />
标记。登录并收到错误时,将页面重定向到模式设置为IE9的页面,并使用查询参数登录,如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<script src="/js/shims.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.6.2/firebase.js"></script>
<script>
(function() {
var config = {
apiKey: '<your keys>',
authDomain: '<your keys>',
databaseURL: '<your keys>',
storageBucket: '<your keys>',
messagingSenderId: '<your keys>'
};
firebase.initializeApp(config);
function getParameterByName(name, url) {
if (!url)
url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)");
var results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
firebase.auth().onAuthStateChanged(function(user) {
if (user)
window.location.replace('/');
else {
firebase.auth()
.signInWithEmailAndPassword(
getParameterByName('user'),
getParameterByName('pass')
)
.then(function() {
window.location.replace('/');
})
.catch(function(error) {
console.log(error);
});
}
});
}());
</script>
</body>
</html>
您会注意到,当用户登录时,这将重定向页面,您还需要更新页面并处理错误的密码等。
调用此页面的代码应类似于:
if (err.code === 'auth/network-request-failed') {
var uri = '/login.html?user='
+ encodeURI(email).replace('@', '%40') + '&pass=' + encodeURI(password);
window.location.replace(uri);
}
答案 2 :(得分:0)
第一个建议是,每当您遇到网络技术问题时打开一个外壳。打开外壳,输入ipconfig flush dns清除浏览器中所有与Web相关的cookie。其次=您必须进入Windows服务并向下滚动,直到找到World Wide Web发布服务为止,该服务允许对与Windows无关的外包数据库进行数据传输。重新打开它。您正在使用Windows测试您的Web应用程序,并且可能正在使用xampp或wamp之类的服务器。安装这些服务器应用程序时,他们将关闭它,或者您将关闭。 IE依赖它,因为上帝知道某些计算机或Windows版本中的内容。不幸的是,您将不得不关闭服务器,将该服务设置为on,以便IE的安全设置无法捕获此错误。通常xampp是问题所在。如果没有两者都运行,则无法使用Firebase进行测试。 Windows不喜欢Google,有时会发生冲突。使用Chrome或获取另一个使用虚拟机的服务器应用程序。