Retrofit2(拦截器)+ GoogleApiClient如何刷新令牌

时间:2016-01-02 02:47:49

标签: android access-token google-api-client okhttp retrofit2

在每个请求中拥有有效IdToken的最佳方法是什么?

我的第一个赌注是一个okhttpclient拦截器,它将令牌添加到每个请求中。但我不知道如何在拦截器内获得有效的令牌。

GoogleApiClient的文档建议在每次获取有效令牌的请求之前调用silentSignIn(GoogleApiClient)。问题是我无法访问拦截器内当前连接的googleapiclient。

2 个答案:

答案 0 :(得分:0)

我最近遇到了类似的问题,我找到了一个不太漂亮但工作正常的解决方案。 您可以使用静态变量。

  public class SessionData {

        private static String sessionId;

    public static String getSessionId() {
        return sessionId;
    }

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

然后,您可以在从Google SDK获取IdToken之后设置它(例如,在用户登录后)。

SessionData.setSessionId(yourCurrentToken);

在您声明Retrofit.Builder的类中,您应该使用以下导入(如您所说,okhttp拦截器)。

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

该课程的内容应如下所示。

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);

    }
}

答案 1 :(得分:0)

GoogleApiClient只是帮助您连接到Auth.GOOGLE_SIGN_IN_API,只要您正确连接/断开它们,就可以创建多个GoogleApiClient。在Google的示例中,autoManage配置为在FragmentActivity中使用GoogleApiClient时保存锅炉铭牌代码。当您需要在非UI代码中使用它时,假设您处于工作线程中。你可以在下面做:

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