2017-02-15 26 views
3

以下の方法で私のサーバーとデータを同期させています。私が有効な認証トークンでログインしている場合、正常に動作します。しかし、authトークンが期限切れになった場合、それを動作させる方法がわかりません。私の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(); 
} 

答えて

0

私はこの

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; 

} 
のような何かをしました
関連する問題