我正在关注尝试为我的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中解锁它,但是无法使其工作。
有什么好方法可以解决这个问题吗?
提前致谢!
答案 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();
}