来自FirebaseUser.getToken的标记“令牌已过期或尚未生效”(true)

时间:2017-03-27 08:03:56

标签: firebase firebase-authentication

我们在Android上遇到身份验证问题:

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
Task<GetTokenResult> tokenTask = firebaseUser.getToken(true)
      .addOnCompleteListener(TaskExecutors.MAIN_THREAD, null);
try {
    token = Tasks.await(tokenTask).getToken();
} catch (Throwable e) { }

并在Java服务器上:

Task<FirebaseToken> authTask = FirebaseAuth.getInstance().verifyIdToken(principal.getClientToken());

try {
    Tasks.await(authTask);
} catch(ExecutionException | InterruptedException e ) {  }
if (authTask.isSuccessful()) {
    firebaseToken = authTask.getResult();
} else {
    log.error(authTask.getException().getMessage());
}

问题是我们得到了log(对应于上面的日志记录语句):

Token has expired or is not yet valid

我们还转储设备号和结果令牌,然后可以在服务器上成功使用它,以便Java服务器验证此令牌......

is not yet valid的含义是什么?在令牌变为有效之前,我们需要等待一段时间吗?

由于Android上的firebaseUser.getToken(true),我们无法对移动客户端进行身份验证。

我们将其更改为firebaseUser.getToken(false)。该呼叫在呼叫之间长时间返回相同的令牌,并且在第一次尝试令牌的一些延迟(接近40秒)之后由服务器验证。因此,经过多次尝试,移动应用程序能够进行身份验证。

等待令牌在一分钟内变为有效所需的时间,这可能是Google服务器上时间不匹配的问题......

在Android上我们使用:

compile 'com.google.firebase:firebase-core:9.2.0'
compile 'com.google.firebase:firebase-messaging:9.2.0'
compile 'com.google.firebase:firebase-auth:9.2.0'
在我们使用的服务器上

compile 'com.google.firebase:firebase-server-sdk:3.0.1'

1 个答案:

答案 0 :(得分:2)

进一步调试问题后,我们发现本地认证服务器依赖于硬件时间。

我们的托管虚拟服务器距离当前时间7分钟。

修复VM硬件时间设置解决了我们的问题。

Google依赖于错误的本地服务器时间并不明智。至少在破碎的VM时间是一致的,它们很可能与其他方比较时间,因此我们导致错误。