【问题标题】:Synchronously verifyIdToken in Firebase java在Firebase java中同步验证IdToken
【发布时间】:2017-06-17 00:48:51
【问题描述】:

我正在构建一个带有 rest API 的 Java 服务器,并且我正在使用 Firebase 对我的用户进行身份验证。

当用户进行重置调用时,他会发送我正在使用下一个方法验证的 Firebase 令牌:

FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken)
        .addOnSuccessListener(decodedToken -> {
            // do some thing
        });

问题是我们谈论的是 HTTP 调用,它们不是同步的。虽然我找到了一种使此方法同步的解决方法,但我很好奇是否有一个原生 Firebase API 可以开箱即用地为我提供。

我的解决方法:

final Object hack = new Object();
synchronized (hack) {
    FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken)
            .addOnCompleteListener(decodedToken -> {
                // do some thing
                synchronized (hack){
                    hack.notifyAll();
                }
            });
    try {
        hack.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 没有简单的方法可以使异步同步。但这听起来像是XY problem。异步处理程序不适用于您的用例的原因是什么?
  • 这里到底有什么需要同步完成的?
  • @cricket_007 我收到来自客户端的请求,由于它是 http,我需要同步返回响应。在我可以这样做之前,我需要验证客户端令牌。所以我希望令牌验证是同步的
  • @FrankvanPuffelen 我想你和 cricket_007 会问同样的问题
  • 哪个先发生?您是在使用带有 Volley 或 Retrofit 等的 HTTP 吗?这些也是异步的。但这并不妨碍您在 Firebase 回调中执行它们,从而使其同步

标签: java firebase firebase-authentication


【解决方案1】:

你有两个选择(一个是 spring 的例子):

  1. 你返回一个 DeferredResult:

    final DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>(5000l);
    FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken)
                .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                    @Override
                    public void onSuccess(FirebaseToken decodedToken) {
                        deferredResult.setResult(decodedToken);
                    }
                });
    return deferredResult;
    
  2. 您强制 Firebase 等待返回的令牌:

    try {
            FirebaseToken decodedToken = Tasks.await(
                    FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken));
    } catch (ExecutionException | InterruptedException e) {
            log.error("Error: {}", e.getLocalizedMessage());
    }
    

【讨论】:

  • 选项 1 不是选项,选项 2 是我实现的,但我不知道他们为此提供了本机 api,太好了!
【解决方案2】:

Firebase 在 6.0.0 版中添加了此功能。

同步verifyToken方法:

FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken)

异步验证令牌方法:

FirebaseAuth.getInstance().verifyIdTokenAsync(firebaseAuthToken)

根据发行说明:

  • Task 接口已被弃用,现已删除。

  • FirebaseAuth、FirebaseMessaging 和 FirebaseInstanceId 接口现在公开了一组阻止方法。每个操作都有阻塞和异步版本。

发行说明:https://firebase.google.com/support/release-notes/admin/java

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 1970-01-01
    • 2019-03-09
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多