1. ホーム
  2. android

[解決済み] Retrofitを使用して、すべての呼び出しを変更せずにOAuthトークンをリフレッシュする

2022-04-23 11:40:35

質問内容

AndroidアプリでRetrofitを使用し、OAuth2で保護されたサーバーと通信しています。RequestInterceptorを使用して、各コールにアクセストークンを含めることで、すべてうまくいっています。 しかし、アクセストークンが期限切れになり、トークンをリフレッシュする必要がある場合があります。トークンの有効期限が切れると、次の呼び出しはUnauthorized HTTPコードで返されるので、これは簡単に監視することができます。 各Retrofitの呼び出しを次のように修正すればいい。 失敗コールバックでエラーコードをチェックし、それがUnauthorizedであれば、OAuthトークンをリフレッシュし、Retrofitの呼び出しを繰り返す。 しかし、そのためにはすべての呼び出しを変更する必要があり、簡単に保守できる良い解決策ではありません。 すべてのRetrofitコールを修正することなく、これを行う方法はないでしょうか?

解決方法は?

を使用しないでください。 Interceptors を使用して、認証を処理します。

現在のところ、認証を処理するための最適な方法は、新しい Authenticator のために特別に設計されたAPIです。 この目的 .

OkHttpは を自動的に尋ねます。 その Authenticator が応答するときの認証情報用 401 Not Authorised さいしょうゆうこうすうじ を添えて。

public class TokenAuthenticator implements Authenticator {
    @Override
    public Request authenticate(Proxy proxy, Response response) throws IOException {
        // Refresh your access_token using a synchronous api request
        newAccessToken = service.refreshToken();

        // Add new header to rejected request and retry it
        return response.request().newBuilder()
                .header(AUTHORIZATION, newAccessToken)
                .build();
    }

    @Override
    public Request authenticateProxy(Proxy proxy, Response response) throws IOException {
        // Null indicates no attempt to authenticate.
        return null;
    }

を添付してください。 Authenticator に対して OkHttpClient と同じように Interceptors

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setAuthenticator(authAuthenticator);

を作成する際に、このクライアントを使用します。 Retrofit RestAdapter

RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(ENDPOINT)
                .setClient(new OkClient(okHttpClient))
                .build();
return restAdapter.create(API.class);