我正在构建一个带有rest API的Java服务器,我正在使用Firebase对我的用户进行身份验证。
当用户进行重置调用时,他会使用下一个方法发送我正在验证的Firebase令牌:
FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken)
.addOnSuccessListener(decodedToken -> {
// do some thing
});
问题是我们正在谈论HTTP调用,那些不是同步的。虽然我找到了一种使这种方法同步的解决方法,但我很好奇是否有一个原生的Firebase API为我提供了开箱即用的功能。
我的工作:
final Object hack = new Object();
synchronized (hack) {
FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken)
.addOnCompleteListener(decodedToken -> {
// do some thing
synchronized (hack){
hack.notifyAll();
}
});
try {
hack.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
答案 0 :(得分:6)
你有两个选择(一个是春天的例子):
您返回DeferredResult:
final DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>(5000l);
FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken)
.addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
@Override
public void onSuccess(FirebaseToken decodedToken) {
deferredResult.setResult(decodedToken);
}
});
return deferredResult;
您强制Firebase等待返回的令牌:
try {
FirebaseToken decodedToken = Tasks.await(
FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken));
} catch (ExecutionException | InterruptedException e) {
log.error("Error: {}", e.getLocalizedMessage());
}
答案 1 :(得分:1)
Firebase在版本6.0.0中添加了此功能。
同步verifyToken方法:
FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken)
异步verifyToken方法:
FirebaseAuth.getInstance().verifyIdTokenAsync(firebaseAuthToken)
根据发行说明:
不推荐使用“任务”界面,现在已将其删除。
FirebaseAuth,FirebaseMessaging和FirebaseInstanceId接口现在公开了一组阻止方法。每个操作都有阻塞和异步版本。
发行说明:https://firebase.google.com/support/release-notes/admin/java