4

すべてのリクエストで有効な IdToken を持つ最善の方法は何ですか?

私の最初の賭けは、すべてのリクエストにトークンを追加する okhttpclient インターセプターです。しかし、インターセプター内で有効なトークンを取得する方法がわかりません。

GoogleApiClient のドキュメントではsilentSignIn(GoogleApiClient)、有効なトークンを取得するためにすべてのリクエストの前に呼び出すことを提案しています。問題は、インターセプター内で現在接続されている googleapiclient にアクセスできないことです。

4

2 に答える 2

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

    }
}
于 2016-01-13T21:41:05.550 に答える