我们在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'
答案 0 :(得分:2)
进一步调试问题后,我们发现本地认证服务器依赖于硬件时间。
我们的托管虚拟服务器距离当前时间7分钟。
修复VM硬件时间设置解决了我们的问题。
Google依赖于错误的本地服务器时间并不明智。至少在破碎的VM时间是一致的,它们很可能与其他方比较时间,因此我们导致错误。