2017-02-15 2 views
3

Ich habe diese Methode unten, die Daten mit meinem Server synchronisiert. Wenn ich mit einem gültigen Authentifizierungs-Token angemeldet bin, funktioniert es einwandfrei. Aber ich bin nicht sicher, wie es funktioniert, wenn der Authentifizierungs-Token abgelaufen ist. In meiner iOS-App überprüfe ich den Wert "expires_in". Wenn dieser abgelaufen ist, verwende ich das Aktualisierungstoken, um ein neues Authentifizierungs-Token zu erhalten. Aber ich bin mir nicht sicher, wie ich das gleiche mit dem Account Manager machen soll. Ich bin mir nicht sicher, wo ich das Refresh-Token vom Gerät bekomme und es an meinen Server sende, um das neue Authentifizierungs-Token zu erhalten.Umgang mit Refresh Tokens mit Android Account Manager

Hier ist ein Beispielverfahren, bei dem ich das Token erhalten:

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

Und hier ist mein 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(); 
} 

Antwort

0

Ich habe so etwas wie dieses

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; 

} 
Verwandte Themen