确保发送的idToken有效

时间:2018-08-23 03:59:36

标签: android firebase firebase-authentication

让我们从一段代码开始:

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(),以便在向服务器发出经过身份验证的请求的方法中立即使用?


其他信息-您不必阅读此书

关于SO的三个相关问题我已经读过:[1] [2] [3]。

Firebase文档的四个相关部分:

  1. FirebaseUser.refreshToken:虽然我已经了解了该令牌的存在,但还没有弄清楚如何获得它。在文档中声明的这种方法似乎并不实际存在。即使我确实获得了它,该令牌又如何帮助我?
  2. FirebaseAuth.IdTokenListener:提到已被When there is a change in the current user's token触发。并不能真正解决第4点提到的问题。
  3. FirebaseAuth.AuthStateListener:尽管确实按照文档的建议将侦听器集成到我的代码中,但我仍在尝试了解它应该如何帮助我。
  4. FirebaseUser.getIdToken:显然,将此方法的布尔值设置为'true'不是一个好习惯。但是,如果您不这样做,似乎您很可能已经在到期之前就获得了idToken,并且虽然当您要求时它可能是有效的,但将其发送到后端服务器进行身份验证时,它可能很好,已经过期了。为什么在每次请求令牌时都不要使用true来确保避免这种烦人的情况?

0 个答案:

没有答案