我正在尝试更新我的angularjs应用以支持Firebase 1.1(我坚持使用Firebase 1.0.x)。
它弃用了firebasesimplelogin,包括Firebase核心内的身份验证。
我已经能够使用
成功实现身份验证authWithOAuthPopup("<provider>", function(error, authData) { ... });
它接受回调,该回调在authData
中传递了身份验证数据。
相反,我不知道如何使用
authWithOAuthRedirect("<provider>", function(error) { ... });
Firebase Authentication docs page非常简洁...... :-(。这就是所说的:
或者[而不是authWithOAuthPopup],您可以提示用户使用完整的浏览器重定向进行登录,Firebase会在您返回原始页面时自动恢复会话
如果Firebase在重定向后返回我的页面,我如何获得authData?
答案 0 :(得分:8)
authData可以直接在ref上注册一个监听器(所以在调用authWithOAuthRedirect
之前)。
ref.onAuth(function(authData) {
...
}
ref.authWithOAuthRedirect("google", function(error) { ... });
请参阅https://www.firebase.com/docs/web/guide/user-auth.html#section-monitoring-authentication
答案 1 :(得分:4)
我想我和你一样遇到了同样的问题。我试图进行Facebook身份验证。
首先,我想澄清我的问题的复制步骤。
传递给onAuth()的回调不会再次使用正确的authData调用。
但是,重新加载应用程序会导致使用正确的authData调用传递给onAuth的回调。我不知道原因,但我怀疑是竞争状态。
这是我的解决方法。
在调用ref.authWithOAuthRedirect(&#39; facebook&#39;,...)之前,在sessionStorage中为自己设置一个标志。
sessionStorage.reload = true;
ref.authWithOAuthRedirect('facebook', ...)
当客户端从Facebook重定向到您的应用程序时,您应该能够检查此标志并在必要时重新加载页面。
if (sessionStorage.reload) {
delete sessionStorage.reload;
setTimeout(function() {
location.reload();
}, 1000)
}
setTimeout(function(){...},1000)有助于对抗假定的竞争条件。我发现500毫秒没有足够的时间来解决竞争条件。
还有一个小问题:如果你过早重新加载页面,那么无论你重新加载页面多少次,authData都会保持为空。