Java 使用Firebase在JAX-RS后端上设置authorization requestfilter

Java 使用Firebase在JAX-RS后端上设置authorization requestfilter,java,firebase,jax-rs,firebase-authentication,backend,Java,Firebase,Jax Rs,Firebase Authentication,Backend,我遵循(非常好的)指南,尝试为我的REST后端实现授权过滤器。但是,我希望使用Firebase的授权模块,因此我的“验证令牌”应该使用Firebase验证令牌 我尝试过这样实现它: private void validateToken(String token, final ContainerRequestContext requestContext) throws Exception { FirebaseAuth.getInstance().verifyIdToken(token)

我遵循(非常好的)指南,尝试为我的REST后端实现授权过滤器。但是,我希望使用Firebase的授权模块,因此我的“验证令牌”应该使用Firebase验证令牌

我尝试过这样实现它:

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) {

                }
    });
}
    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();
}
private void validateToken(字符串标记,final ContainerRequestContext requestContext)引发异常{
FirebaseAuth.getInstance().verifyIdToken(令牌)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseToken已解码){
System.out.println(“成功”);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
系统输出打印项次(“失败”+e);
requestContext.abortWith(Response.status(Response.status.UNAUTHORIZED.build());
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
}
});
}
但是问题是监听器当然是在不同的线程中运行的,所以现在看来,请求将通过,onFailure监听器将无法中止它

我只需在底部添加一个睡眠计时器就可以了,不过我想要一个更好的解决方案。我尝试使用
synchronized
锁定主线程,尝试在onCompleteListener中解锁它,但未能使其工作

有什么好办法解决这个问题吗


提前谢谢

我设法用倒计时锁来实现它。太谢谢你了,皮斯基勒

对于任何感兴趣的人,我的解决方案如下所示:

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) {

                }
    });
}
    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();
}
private void validateToken(字符串标记,final ContainerRequestContext requestContext)引发异常{
最终倒计时闩锁=新倒计时闩锁(1);
FirebaseAuth.getInstance().verifyIdToken(令牌)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseToken已解码){
System.out.println(“成功时”);
倒计时();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
系统输出打印项次(“失败时”+e);
requestContext.abortWith(Response.status(Response.status.UNAUTHORIZED.build());
倒计时();
}
});
satch.wait();
}

如果要阻止直到完成,可以使用“谢谢”!我一直在研究倒计时锁存器,但还没有弄清楚如何以这种方式实现它。但如果你认为有可能的话,我肯定会再尝试一次。