2016-11-01 73 views
1

我使用改造2和火力地堡验证之前,我用我的令牌存储在SharedPreferences和我HttpInterceptor如何在不使用任务监听器的情况下获取Firebase身份验证令牌?

@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)

+0

Hi @bikash。你使用什么而不是“XXXX”来解决问题? – Chisko

+0

我已经使用@Benoit给出的解决方案,到目前为止,它的做工不错,你可以试试,过多 – Bikash

+0

谢谢,但我想和令牌不被接受。当我看到你的回答时,我附加了“持票人”,我得到了不同的回应,但仍然未经授权,所以我想知道你所说的是什么,而不是“XXXX”。 – Chisko

回答

3

我不知道理解整个问题,而是要等待侦听器回调(换句话说,使得出异步调用的同步方法),可以达到这样的:

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秒)应适合您的情况

希望这有助于。

+0

这正是我一直在寻找,我刚修改的代码首先得到与布尔缓存标记设置为false,那么如果其到期临近不是打电话再次布尔设置为true以获取刷新标记 – Bikash

相关问题