2017-06-17 97 views
0

我使用rest API构建Java服务器,并使用Firebase对我的用户进行身份验证。在Firebase中同步verifyIdToken java

当用户进行复位电话,他向火力地堡的令牌,我使用下一个方法验证:

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

有没有简单的方法来使异步同步。但这听起来像[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。异步处理程序不适用于您的用例的原因是什么? –

+0

这里究竟是什么需要同步完成? –

+0

@ cricket_007我收到来自客户端的请求,因为它是http,我需要同步返回响应。在我能做到这一点之前,我需要验证客户端令牌。所以我希望令牌验证是同步的 –

回答

5

你有两个选择(一个是弹簧为例):

  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; 
    
  2. 你力Firebase等待返回的令牌:

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

选项1不是一个选项,选项2是我实现的,但我不知道他们得到了原生API,太好了! –