2017-05-01 5 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 갈 수 있도록 청취자가, 다른 스레드에서 실행 물론입니다입니다 청취자는 그것을 중단시킬 수 없다.

나는 아래쪽에 수면 타이머를 추가하여 작동 시켰지만 더 나은 솔루션을 원합니다. 나는 주 스레드를 synchronized을 사용하여 잠그려고했으나 onCompleteListener에서 잠금을 해제하려고 시도했지만 작동하지 못했습니다.

이 문제를 해결할 수있는 좋은 방법이 있습니까?

미리 감사드립니다.

+0

, 당신이 사용할 수있는 ['CountDownLatch'] (https://docs.oracle.com/javase/ 7/docs/api/java/util/concurrent/CountDownLatch.html) –

+0

고마워! CountDownLatch를 조금 봤지만 구현 방법을 파악하지 못했습니다. 그렇게 할 수 있다고 생각된다면 나는 확실히 다른 것을 시도 할 것입니다. – Lars

답변

0

CountDownLatch를 사용하여 작동하도록 관리했습니다. 큰 감사도 peeskillet! 관심있는 사람들을위한

, 내 솔루션은 다음과 같습니다 : 당신이 완료 때까지 차단하려면

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(); 
}