如何在使用 Firebase 的 authWithOAuthRedirect 时避免重定向循环



我运行了以下代码,这导致页面继续尝试重新加载,而用户似乎从未通过身份验证。应该注意的是,当使用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或更新版本。

相关内容

  • 没有找到相关文章