如何在不使用任务监听器的情况下获取Firebase身份验证令牌?

4

我正在使用Retrofit 2,在使用Firebase Auth之前,我习惯于将令牌存储在SharedPreferences中,并在我的HttpInterceptor中使用。

@Named("rest_api")
@Singleton
@Provides
Interceptor provideRESTInterceptor(final UserManager userManager) {
    return new Interceptor() {
        @Override
        public Response intercept(final Chain chain) throws IOException {
            final Request original = chain.request();

            Request request = original.newBuilder()
                    .header("Accept", "application/json")
                    .header("Authorization", "XXXX " + sharedPreference.getToken())
                    .method(original.method(), original.body())
                    .build();

            Response response = chain.proceed(request);
            return response;
        }
    };
}

我该如何使用 FirebaseUser.getToken(false/true) 实现类似这样的功能? 我不知道如何等待监听器回调,然后使用Firebase令牌处理请求。

我也打算在此处检查令牌有效性,如果即将过期,则使用 getToken(true)


嗨@bikash。你用什么代替“XXXX”,这样解决方案才能起作用? - Chisko
我使用了@Benoit给出的解决方案,目前它运行良好,您也可以尝试使用。 - Bikash
谢谢,但我尝试了,令牌没有被接受。当我看到你的答案时,我在它后面添加了“Bearer”,我得到了一个不同的响应,但仍然是未经授权的,所以我想知道你用什么代替了“XXXX”。 - Chisko
那是您的承载者应该去的地方,您应该检查您的API要求,比如如果您的公司名字叫做Google,则可以搜索"token"。您尝试调用哪个API? - Bikash
没有API要求。这是一个个人项目,我对HTTPS请求还很陌生。 - Chisko
1个回答

10

我不确定是否完全理解了整个问题,但是要等待侦听器回调(换句话说,将异步调用转换为同步方法)可以通过以下方式实现:

private String getToken() {
    final StringBuilder token = new StringBuilder() ;
    final CountDownLatch countDownLatch = new CountDownLatch(1) ;
    FirebaseAuth.getInstance().getCurrentUser().getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
        @Override
        public void onComplete(@NonNull Task<GetTokenResult> task) {
            token.append(task.getResult().getToken());
            countDownLatch.countDown();
        }
    });
    try {
        countDownLatch.await(30L, TimeUnit.SECONDS);
        return token.toString() ;
    } catch (InterruptedException ie) {
        return null;            
    }
}

注:

  • StringBuilder 在此处仅用作字符串容器。
  • 高可靠性的实现当然应该检查 task.isSuccessful()。
  • 超时时间(此处为30秒)应根据您的情况进行调整。

希望这能帮到您。


这正是我正在寻找的,我只是修改了代码以首先使用布尔值为false获取缓存令牌,然后如果其到期时间接近,则再次调用并将布尔值设置为true以获取刷新令牌。 - Bikash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接