2017-05-09 237 views
0

我使用Javascript Firebase SDK来验证我的用户,它对于“正常”登录/注销过程正常工作。 现在我还有一个打开的套接字连接和REST-Api调用,这取决于身份验证令牌的有效性。遗憾的是,当令牌过期时,似乎onAuthStateChanged函数未被调用。onAuthStateChanged令牌刷新

onAuthStateChanged回调函数的定义如下:

Auth._onAuthStateChanged = function() { 
    var that = this; 

    return function(oUser) { 
     // We can extend the User Object with values we need or want. 
     if (oUser && !that._oUser) { 
     that.onFirebaseSignIn(oUser); 
     } else if (oUser && that._oUser && oUser.uid !== that._oUser.uid) { 
     that.onFirebaseUserChanged(); 
     } else if (oUser && that._oUser && oUser.uid === that._oUser.uid) { 
     that.onFirebaseTokenChanged(); 
     } else if (!oUser) { 
     that.onFirebaseSignOut(); 
     } 
    }; 
    }; 

现在类似的工作在Android精品正确通知我,如果令牌到期。 定义是这样的:

mAuthListener = new FirebaseAuth.AuthStateListener() { 
    @Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
     if (firebaseAuth.getCurrentUser() != null && AccountTools.getCurrentUserId() == null) { 
      onFirebaseSignIn(firebaseAuth); 
     } else if (firebaseAuth.getCurrentUser() != null && 
       AccountTools.getCurrentUserId() != null && 
       !AccountTools.getCurrentUserId().equals(firebaseAuth.getCurrentUser().getUid())) { 
      onFirebaseUserChanged(); // This may be the same as just signIn! 
     } else if (firebaseAuth.getCurrentUser() != null && 
       AccountTools.getCurrentUserId() != null && 
       AccountTools.getCurrentUserId().equals(firebaseAuth.getCurrentUser().getUid())) { 
      getAuthToken(false); 
     } else if (firebaseAuth.getCurrentUser() == null){ 
      onFirebaseSignOut(); 
     } 
    } 
}; 

定义的onAuthStateChanged回调不是不够好行为就靠这个?如果不。我有什么选择?每次我进行REST调用时,我都需要一个有效的令牌,并且在进行任何REST调用之前真的不需要依赖总是调用getToken(),而宁可让它与其他任何事情都是异步的。谢谢!

+0

令牌不会自动刷新,除非您使用实时数据库或在令牌过期时调用getToken()。如果你想令牌自动刷新,你必须设置你自己的主动刷新每小时(令牌的生命周期)并调用getToken(true); – bojeil

+0

我知道该令牌不会自动刷新,但根据我的理解,firebase应该通知我有关令牌的过期时间,因为它可以在内部保存到期时间。这个通知对Android(Java)有效,但似乎不适用于Javascript。 – puelo

+0

Android和Javascript SDK应该表现相同。我不确定你在问什么。你是否在你的应用中使用实时数据库?令牌不应在到期时公布。他们在刷新时宣布。 – bojeil

回答

0

我想我在Android的onAuthStateChanged的文档中理解了这句话,并认为这意味着当令牌过期时会调用该函数。相反,它只是叫那么令牌实际上改变:

当在改变当前用户的令牌

https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth.AuthStateListener

我有这个在Javascript由JWT令牌解码目前实施然后使用带有过期日期的setTimeout函数。在名为i的函数中,为令牌执行强制刷新。 这应该确保令牌始终有效。