我运行了以下代码,这导致页面继续尝试重新加载,而用户似乎从未通过身份验证。应该注意的是,当使用authWithOAuthPopup
方法时,这与预期的一样有效。
var myDataRef = new Firebase("https://<my-firebase>.firebaseio.com");
var existingAuthData = myDataRef.getAuth(); //After the oauth redirect and every subsequent load, this is always null
//register onAuth listener
myDataRef.onAuth(function(authData) {
//We never get this far as the page continues to attempt to load
if (authData !== null){
console.log('logged in now!')
}
else {
console.log('not logged in yet')
}
})
if (existingAuthData !== null) {
console.log('User already logged in');
}
else {
console.log('getAuth returned nothing - authenticating');
myDataRef.authWithOAuthRedirect("github", function(error, authData) {
if (error) {
console.log("Login Failed!", error);
} else {
console.log("Authenticated successfully with payload:", authData);
}
});
}
使用github进行身份验证后,页面被重定向回我的自定义域,并附加一个哈希:#&__firebase_request_key=Qwnn9TtM2fsIHq44vhCcbXbPa0DMPL1N
。
然后重新加载页面,在url中只留下#,然后使用firebase_request_key散列再次重新加载。这种情况将无限期地持续下去。
同样,值得注意的是,如果我将authWithOAuthRedirect
方法切换为authWithOAuthPopup
,这将按预期工作。
如何使重定向方法按我期望的方式工作?
使用ref.authWithOAuthRedirect
时,不能使用同步ref.getAuth()
来监视身份验证状态。您必须使用ref.onAuth(<callback>)
来监视身份验证状态。例如:
//create your root reference
var rootRef = new Firebase('https://example.firebaseio.com/');
// Create a callback which logs the current auth state
function authDataCallback(authData) {
if (!authData) {
console.log(authData);
rootRef.authWithOAuthRedirect("github", function (error) {
console.log("Login Failed!", error);
});
}
else {
console.log("Authenticated successfully with payload:", authData);
}
}
rootRef.onAuth(authDataCallback);
我遇到了同样的问题,这似乎是一个竞争条件。使用setTimeout()稍微延迟身份验证有帮助。
类似这样的东西:
var onAuthCallback = function(authData) {
if (!authData) {
rootRef.authWithOAuthRedirect("google", function (error) {
console.log("Login Failed!", error);
});
}
else {
console.log("Authenticated successfully with payload:", authData);
rootRef.offAuth(onAuthCallback);
}
};
// Important: don't request authentication immediately
setTimeout(function() { rootRef.onAuth(onAuthCallback); }, 400);
这在Firebase的2.4版本中已经修复。请参阅javascript api的更改日志。
尝试https://cdn.firebase.com/js/client/2.4.1/firebase.js
或更新版本。