Firebase authWithOAuthRedirect()惹恼了

时间:2014-10-15 18:56:27

标签: firebase firebase-security firebasesimplelogin

我正在尝试更新我的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?

2 个答案:

答案 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身份验证。

首先,我想澄清我的问题的复制步骤。

  1. 我的应用已加载到客户端。
  2. 用户点击登录Facebook。
  3. ref.authWithOAuthRedirect(&#39; facebook&#39;,...)被调用。
  4. 客户端被重定向到Facebook,Facebook将客户端重定向回Firebase应用程序
  5. 尽管使用Facebook成功验证,但使用authData === null调用传递给onAuth()的回调(仅一次)。
  6. 传递给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都会保持为空。