2016-01-02 4 views
4

Quelle est la meilleure façon d'avoir un IdToken valide dans chaque requête?Retrofit2 (intercepteur) + GoogleApiClient comment rafraîchir le jeton

Mon premier pari serait un intercepteur okhttpclient qui ajoute le jeton à chaque requête. Mais je ne sais pas comment obtenir un jeton valide à l'intérieur de l'intercepteur.

La documentation de GoogleApiClient suggère d'appeler silentSignIn(GoogleApiClient) avant chaque demande pour obtenir un jeton valide. Le problème est que je n'ai pas accès au googleapiclient connecté courant dans l'intercepteur.

Répondre

0

J'ai récemment fait face à un problème similaire et j'ai trouvé une solution pas très belle, mais fonctionnante. Vous pouvez utiliser une variable statique.

public class SessionData { 

     private static String sessionId; 

    public static String getSessionId() { 
     return sessionId; 
    } 

    public static void setSessionId(String sessionId) { 
     SessionData.sessionId = sessionId; 
    } 
    } 

Ensuite, vous pouvez régler le IdToken, après que vous l'obtenez à partir du SDK Google (par exemple après que l'utilisateur connecté).

SessionData.setSessionId(yourCurrentToken); 

Dans la classe où vous déclarez la Retrofit.Builder, vous devez utiliser les importations suivantes (comme vous le dites, l'intercepteur okhttp).

import com.squareup.okhttp.Interceptor; 
import com.squareup.okhttp.OkHttpClient; 
import com.squareup.okhttp.Request; 
import com.squareup.okhttp.Response; 

Et le contenu de la classe devrait ressembler à ceci.

public class RestClient implements Interceptor { 

    public RestClient() { 

     OkHttpClient httpClient = new OkHttpClient(); 
     // add your other interceptors … 
     // add logging as last interceptor 

     httpClient.interceptors().add(this); // <-- this adds the header with the sessionId to every request 

     Retrofit restAdapter = new Retrofit.Builder() 
       .baseUrl(RestConstants.BASE_URL) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(httpClient) 
       .build(); 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 

     if (SessionData.getSessionId() != null) { 
      Request newRequest = originalRequest.newBuilder() 
        .header("sessionId", SessionData.getSessionId()) 
        .build(); 
      return chain.proceed(newRequest); 
     } 
     return chain.proceed(originalRequest); 

    } 
} 
0

GoogleApiClient vous aide simplement vous connecter à Auth.GOOGLE_SIGN_IN_API et vous pouvez créer plusieurs GoogleApiClient aussi longtemps que vous vous connectez/les déconnecter correctement. Dans l'exemple de Google, autoManage est configuré pour vous enregistrer le code de plaque de chaudière lorsque vous utilisez GoogleApiClient dans un FragmentActivity. Lorsque vous avez besoin de l'utiliser dans un code non-UI, en supposant que vous êtes sur un thread de travail. Vous pouvez faire ci-dessous:

private static final GoogleSignInOptions sGso = 
    new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestIdToken(SERVER_CLIENT_ID) 
     .requestEmail() 
     .build(); 

// In your interceptor code: 
GoogleApiClient apiClient = new GoogleApiClient.Builder(mContext) 
    .addApi(Auth.GOOGLE_SIGN_IN_API, sGso) 
    .build(); 

try { 
    ConnectionResult result = apiClient.blockingConnect(); 
    if (result.isSuccess()) { 
     GoogleSignInResult googleSignInResult = 
      Auth.GoogleSignInApi.silentSignIn(apiClient).await(); 
     if (googleSignInResult.isSuccess) { 
      String idToken = googleSignInResult.getIdToken(); 
      // set to header and pass to your server 
     } 
     ... 
    } 
} finally { 
    apiClient.disconnect(); 
}