【问题标题】:How to handle refresh tokens with android account manager如何使用 android 帐户管理器处理刷新令牌
【发布时间】:2017-07-04 10:27:21
【问题描述】:

我在下面有这个方法可以与我的服务器同步数据。如果我使用有效的身份验证令牌登录,它工作正常。但是如果身份验证令牌已过期,我不确定如何使其工作。在我的 iOS 应用程序中,我检查“expires_in”值,如果它已过期,我使用刷新令牌来获取新的身份验证令牌。但我不确定如何使用客户经理做同样的事情。我不确定我在哪里处理从设备获取刷新令牌并将其发送到我的服务器以获取新的身份验证令牌。

这是我获取令牌的示例方法:

@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    Intent i = new Intent("Sync Started");
    mContext.sendBroadcast(i);

    String token = mAccountManager.blockingGetAuthToken(account, AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, true);

    // do sync here using token
}

这是我的 AbstractAccountAuthenticator -> getAuthToken:

@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
    Bundle result;
    result = AuthHelper.getAccessTokenFromDevice(context, account, authTokenType);
    if (result != null) {
        return result;
    }
    final String refreshToken = AuthHelper.getRefreshTokenFromDevice(context, account);
    if (refreshToken != null) {
        result = AuthHelper.makeResultBundle(account, refreshToken, null);
        return result;
    }
    if (AuthHelper.isAccountAvailable(context, account)) {
        result = AuthHelper.makeResultBundle(account, null, null);
        return result;
    }
    return new Bundle();
}

【问题讨论】:

    标签: android oauth-2.0 accountmanager


    【解决方案1】:

    我做了这样的事情

    public Object getUserInfo(String token){
    
        try {
    
            Log.d(TAG, "getUserInfo: "+token);
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.add("token", token);
    
            HttpEntity<String> request = new HttpEntity<>(null, headers);
    
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    
            ResponseEntity<User> obj = restTemplate.exchange(URL_API_GET_USER_INFO, HttpMethod.GET, request, User.class);
    
            Log.d(TAG, "getUserInfo: returning User");
            return obj.getBody();
        }
        catch (HttpClientErrorException e){
    
            if (e.getStatusCode().value() != 403){
                return e.getMessage();
            }
    
            Log.d(TAG, "getUserInfo: forbidden, my current token is expired");
    
            //invalidate current token
            AccountManager am = AccountManager.get(mContext);
            am.invalidateAuthToken("cu.jaco.accountexample", token);
    
            //request new token to my server
            String mNewToken = requestToken();
            if (!StringUtils.isEmpty(mNewToken)){
                //if we get a new token call recursively getUserInfo with new token
                return getUserInfo(mNewToken);
            }
    
            return e.getMessage();
        }
        catch (RestClientException e){
            e.printStackTrace();
            Log.d(TAG, "getUserInfo: "+e.getMessage());
            return null;
        }
    }
    
    
    
    private String requestToken(){
    
        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
            return null;
        }
    
        AccountManager mAccountManager = AccountManager.get(mContext);
        Account[] acc = mAccountManager.getAccountsByType("cu.jaco.accountexample");
    
        //AccountAuthenticator is my class that extends form AbstractAccountAuthenticator
        AccountAuthenticator authenticator = new AccountAuthenticator(mContext);
        Bundle bundle;
        try {
            //ask directly for a new token
            bundle = authenticator.getAuthToken(null, acc[0], "cu.jaco.accountexample.user", null);
        } catch (NetworkErrorException e1) {
            e1.printStackTrace();
            return e1.getMessage();
        }
    
        String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
    
        //refresh token in AccountManager
        mAccountManager.setAuthToken(acc[0], "cu.jaco.accountexample.user", token);
    
        return token;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2016-03-22
      • 2023-01-25
      • 2021-06-11
      相关资源
      最近更新 更多