首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AccountManager.blockingGetAuthToken stucks

AccountManager.blockingGetAuthToken stucks
EN

Stack Overflow用户
提问于 2017-12-04 06:08:32
回答 0查看 374关注 0票数 0

我创建了一个通过Retrofit2与服务器同步数据的AbstractThreadedSyncAdapter。为了处理身份验证,我创建了一个拦截器来添加令牌。

当拦截器需要通过调用accountManager.blockingGetAuthToken(...)来刷新令牌时,它会一直阻塞,直到抛出android.accounts.OperationCanceledException。当我在AbstractAccountAuthenticator -> getAuthToken中放置一个断点时,直到拦截器完成才会命中它。

代码语言:javascript
复制
public class TokenInterceptor implements Interceptor {

  @Override
  public Response intercept(Chain chain) throws IOException {
    String oldToken = accountManager.peekAuthToken(accounts[0], LoginActivity.AUTH_TOKEN_TYPE);
    
    if(newTokenRequired){
       accountManager.invalidateAuthToken(LoginActivity.ACCOUNT_TYPE, oldToken);
    }
    
    String token = accountManager.blockingGetAuthToken(accounts[0], LoginActivity.AUTH_TOKEN_TYPE, true); // <-- stucks here
    
    // add token to request and return response
  }

}

这是AccountAuthenticator中的getAuthToken方法

代码语言:javascript
复制
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) {
   final AccountManager accountManager = AccountManager.get(context);
   final String refreshToken = accountManager.getPassword(account);
   final Bundle bundle = new Bundle();

   if (refreshToken != null) {
       try {
           Response<RefreshTokenResponse> refreshTokenResponse = apiService.refreshToken(refreshToken).execute();

           if (refreshTokenResponse.isSuccessful()) {
               bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
               bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
               bundle.putString(AccountManager.KEY_AUTHTOKEN, refreshTokenResponse.body().getAccess_Token());
               accountManager.setPassword(account, refreshTokenResponse.body().getRefresh_token());
               return bundle;
           }
       } catch (Exception e) {
           Log.e(AccountAuthenticator.class.getName(), "getAuthToken: failed to get access token", e);
       }
   }

   // start login intent
   final Intent intent = new Intent(context, LoginActivity.class);
   intent.putExtra(LoginActivity.PARAM_USER_PASS, account.name);
   intent.putExtra(LoginActivity.AUTH_TOKEN_TYPE, authTokenType);
   intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
   bundle.putParcelable(AccountManager.KEY_INTENT, intent);
   return bundle;
}

我不认为如何调用blockingGetAuthToken不是问题,因为如果我注释掉拦截器中的invalidateAuthToken(...),它将返回一个缓存的令牌。

当我在拦截器中发出另一个HTTP请求时,会不会有问题?(apiService.getBlaBlaBla() -> tokenInterceptor -> getAuthToken -> apiService.refreshToken() )

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47623863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档