2017-06-17 48 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,太好了! –