让我们从一段代码开始:
public static String getIdToken() {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String[] idToken = new String[1];
idToken[0] = "";
if (user != null) { // si connecté
user.getIdToken(false) // boolean = refresh token
.addOnCompleteListener((task) -> {
if (task.isSuccessful()) {
idToken[0] = task.getResult().getToken();
Log.w("idToken (OAuth 2)", idToken[0]);
} else {
// Handle error -> task.getException();
Log.w("Auth Token", "FAILURE := idToken (OAuth 2)");
task.getException().printStackTrace();
}
});
}
// TODO: Verify that this is correct
Log.w("Auth idToken","should be something: " + idToken[0]);
return idToken[0];
}
不幸的是,这是异步,这意味着我无法信任返回的值,因为任务在使用前可能尚未完成。
我无法使用一个属性来设置idToken,因为它每小时都会过期。
FirebaseAuth.IdTokenListener显然应该是我的救星。使用此属性,我可能拥有一个随时需要更新的属性,可以访问该属性而不必担心异步任务。 但是,如果令牌距离到期还有2毫秒,而我恰巧将那个令牌发送到服务器以验证请求,该怎么办?侦听器是否足够聪明,可以在5分钟前更新令牌另一个过期,因此这种情况永远不会发生?没有任何文档。
更不用说this来自SO的帖子说"onIdTokenChanged" is triggered anytime the ID token changes. It won't fire if the ID token is expired. It will fire if a new ID token is refreshed [...]
在这里带来了一些混乱。
如何正确设置一个getIdToken()
,以便在向服务器发出经过身份验证的请求的方法中立即使用?
Firebase文档的四个相关部分:
When there is a change in the current user's token
触发。并不能真正解决第4点提到的问题。true
来确保避免这种烦人的情况?