使用 Firebase 在 JAX-RS 后端设置授权请求过滤器

Setting up authorization requestfilter on JAX-RS backend with Firebase

我正在按照 this(非常棒)指南尝试为我的 REST 后端实施授权过滤器。但是,我想使用 Firebase 的授权模块,所以我的 'verify token' 应该使用 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) {

                }
    });
}

但问题是监听器当然 运行 在不同的线程中,所以现在看起来,请求将通过并且 onFailure 监听器将无法中止它。

我只是通过在底部添加一个睡眠定时器来让它工作,但是我想要一个更好的解决方案。我尝试使用 synchronized 锁定主线程,尝试在 onCompleteListener 中将其解锁,但无法使其工作。

有什么好的方法可以解决这个问题吗?

提前致谢!

我设法使用 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();
}