2017-06-17 16 views
0

私は残りのAPIを使用してJavaサーバーを構築しています。私はFirebaseを使用してユーザーを認証しています。問題は、我々はHTTP呼び出しについて話している、それらが同期していないということですFirebase Javaの同期verifyIdToken java

FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken) 
     .addOnSuccessListener(decodedToken -> { 
      // do some thing 
     }); 

:ユーザーが、彼は私が次のメソッドを使用して検証していますFirebaseトークンを送信し、リセット呼び出しを行う

。このメソッドを同期させるための回避策が見つかっても、それをそのままの状態で提供するネイティブ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

あなたは2つのオプション(1春の例です)があります。

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; 
  • あなた力:

    1. あなたはDeferredResultを返します返されたトークンを待つFirebase:

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

    オプション1はオプションではありません。オプション2は私が実装したものですが、ネイティブAPIを持っていることは分かりませんでした。 –