2017-05-01 3 views
0

私は、RESTバックエンド用の認証フィルタを実装しようとするとthis(かなり良い)ガイドに従っています。しかし、Firebaseの認証モジュールを使用したいので、私の 'verify token'はfirebaseを使ってトークンを検証する必要があります。FirebaseでJAX-RSバックエンドで承認リクエストフィルタを設定する

私はこのようにそれを実装しようとしました:

private void validateToken(String token, final ContainerRequestContext requestContext) throws Exception { 
    FirebaseAuth.getInstance().verifyIdToken(token) 
      .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() { 

       @Override 
       public void onSuccess(FirebaseToken decodedToken) { 
        System.out.println("success"); 
       } 
      }).addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception e) { 
        System.out.println("fail" + e); 
        requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build()); 
       } 

      }).addOnCompleteListener(new OnCompleteListener<FirebaseToken>() { 
       @Override 
       public void onComplete(@NonNull Task<FirebaseToken> task) { 

       } 
    }); 
} 

をしかし、問題は、それが今に見えるよう、要求が通過し、ONFAILUREますので、リスナーが、別のスレッドで実行されている、もちろんあるありますリスナーはそれを中止することはできません。

私はそれを下にスリープタイマーを追加するだけで動作させましたが、もっと良い解決策が必要です。私は​​を使ってメインスレッドをロックしようとしましたが、onCompleteListenerでロックを解除しようとしましたが、動作させることができませんでした。

これを回避する良い方法はありますか?

ありがとうございます!

+0

あなたが完了ゴマブロックしたい場合は、[ 'CountDownLatch']を使用することができます(https://docs.oracle.com/javase/:興味がある人々のために

、私の解決策は次のようになります7/docs/api/java/util/concurrent/CountDownLatch.html) –

+0

ありがとう!私はCountDownLatchを少し見てきましたが、そのように実装する方法を理解することはできませんでした。しかし、私は間違いなくそれを可能にすると思うならば、もう一度それを与えるでしょう。 – Lars

答えて

0

CountDownLatchを使用して動作させることができました。大きなおかげでペスキレ!

private void validateToken(String token, final ContainerRequestContext requestContext) throws Exception { 

    final CountDownLatch latch = new CountDownLatch(1); 

    FirebaseAuth.getInstance().verifyIdToken(token) 
      .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() { 
       @Override 
       public void onSuccess(FirebaseToken decodedToken) { 
        System.out.println("on success"); 
        latch.countDown(); 
       } 
      }).addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception e) { 
        System.out.println("on fail " + e); 
        requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build()); 
        latch.countDown(); 
      } 
     }); 
    latch.await(); 
} 
関連する問題