使用 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();
}
我正在按照 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();
}