2017-02-15 1 views
3

J'ai cette méthode ci-dessous qui synchronise les données avec mon serveur. Si je suis connecté avec un jeton d'authentification valide, cela fonctionne correctement. Mais je ne sais pas comment le faire fonctionner si le jeton d'authentification a expiré. Dans mon application iOS, je vérifie la valeur "expires_in", et si elle a expiré, j'utilise le jeton d'actualisation pour obtenir un nouveau jeton d'authentification. Mais je ne suis pas sûr de savoir comment faire la même chose en utilisant le gestionnaire de compte. Je ne suis pas sûr de l'endroit où je peux récupérer le jeton d'actualisation de l'appareil et l'envoyer à mon serveur pour obtenir le nouveau jeton d'authentification.Comment gérer les jetons d'actualisation avec le gestionnaire de compte android

Voici un exemple de méthode où je reçois le jeton:

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

Et voici mon 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(); 
} 

Répondre

0

Je l'ai fait quelque chose comme ça

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; 

}