为什么FirebaseAuth.IdTokenChanged在登录时调用2次?

时间:2019-04-01 18:06:56

标签: c# firebase unity3d firebase-authentication

我正在使用强大的自定义后端部分进行应用程序开发,其中每个API请求调用在标头中都包含Firebase身份验证令牌。在测试过程中,我们意识到令牌始终会收到两次。

我使用了与Firebase示例项目中所述相同的逻辑。为确保这不是我的错,我检查了干净的示例项目,结果仍然相同-以某种方式在登录时两次调用OnIdTokenChanged。两个回调都包含正确的令牌。 我正在使用Unity 2018.3.5f1,.NET 4.5和Firebase SDK v.5.4.4

以下是一些代码示例:

public virtual void Start() {
  Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
    dependencyStatus = task.Result;
    if (dependencyStatus == Firebase.DependencyStatus.Available) {
      InitializeFirebase();
    } else {
      Debug.LogError(
        "Could not resolve all Firebase dependencies: " + dependencyStatus);
    }
  });
}

protected void InitializeFirebase() {
  DebugLog("Setting up Firebase Auth");
  auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
  auth.StateChanged += AuthStateChanged;
  auth.IdTokenChanged += IdTokenChanged;
}

void IdTokenChanged(object sender, System.EventArgs eventArgs) {
  Firebase.Auth.FirebaseAuth senderAuth = sender as Firebase.Auth.FirebaseAuth;
  if (senderAuth == auth && senderAuth.CurrentUser != null && !fetchingToken) {
    senderAuth.CurrentUser.TokenAsync(false).ContinueWith(
      // THIS CALLED TWICE
      task => DebugLog(String.Format("Token = {0}", task.Result)));
  }
}

一些重要的应用逻辑基于令牌接收事件,该事件仅应接收一次,并且一次登录就获得2个令牌是完全不正确的。

是错误还是预期的行为?如果存在错误,在其他平台(例如iOS / Android本机)上是否存在相同的行为,或者仅仅是Unity3d问题?

1 个答案:

答案 0 :(得分:0)

我希望第一次调用将在附加侦听器之后立即发生,在这种情况下,这是从应用程序的缓存中获取的本地令牌。第二次是客户端与服务器一起验证令牌仍然有效或刷新ID令牌之后。

来自documentation on the IDTokenChanged event

  

身份验证ID令牌更改为:

     
      
  • 用户登录时
  •   
  • 当前用户退出时
  •   
  • 当前用户更改时
  •   
  • 当前用户的令牌发生更改
  •