在Firebase java中同步verifyIdToken

Ily*_*man 1 java firebase firebase-authentication

我正在构建一个带有rest API的Java服务器,我正在使用Firebase来验证我的用户.

当用户进行重置调用时,他会使用下一个方法发送我正在验证的Firebase令牌:

FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken)
        .addOnSuccessListener(decodedToken -> {
            // do some thing
        });
Run Code Online (Sandbox Code Playgroud)

问题是我们正在谈论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();
    }
}
Run Code Online (Sandbox Code Playgroud)

pue*_*elo 6

你有两个选择(一个是春天的例子):

  1. 你返回一个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;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您强制Firebase等待返回的令牌:

    try {
            FirebaseToken decodedToken = Tasks.await(
                    FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken));
    } catch (ExecutionException | InterruptedException e) {
            log.error("Error: {}", e.getLocalizedMessage());
    }
    
    Run Code Online (Sandbox Code Playgroud)