使用Firebase

时间:2017-05-01 12:21:05

标签: java firebase jax-rs firebase-authentication backend

我正在关注尝试为我的REST后端实现授权过滤器的this(非常棒)指南。但是,我想使用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) {

                }
    });
}

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

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

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

提前致谢!

1 个答案:

答案 0 :(得分: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();
}