OkHttp3 Authenticator вызывается, даже когда нет 401 - PullRequest
0 голосов
/ 09 января 2019

У меня есть аутентификатор, который, я полагаю, должен запускаться только тогда, когда есть 401 для любого вызова API. Но я сталкиваюсь со странным поведением, когда по какой-то причине метод authenticate () вызывается, даже когда нет 401.

Затем приложение несколько раз обновляет токены. Я уверен, что authenticate () - это единственное место, где я обновляю токен с истекшим сроком доступа.

Вот как выглядит мой класс Authenticator:

  public class MyAuthenticator implements Authenticator {

  Context context;

  public MyAuthenticator(Context context) {
     this.context = context;
  }

  @Nullable
  @Override
  public Request authenticate(Route route, Response response) throws 
  IOException {

    Retrofit client = new Retrofit.Builder()
        .baseUrl(URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

    ApiService service = client.create(ApiService.class);

    SharedPreferenceManager sharedPreferenceManager = new 
    SharedPreferenceManager(context);
    String refreshToken = 
    sharedPreferenceManager.getRefreshToken(context);

    AuthRequest authRequest = new AuthRequest();
    authRequest.grant_type = "refresh_token";
    authRequest.refresh_token = refreshToken;

    Call<authResponse> refreshTokenResult = 
    service.refreshToken(authRequest);
    retrofit2.Response accessTokenResponse = 
    refreshTokenResult.execute();
    //check if response equals 400 , mean empty response
    if (accessTokenResponse.isSuccessful()) {
        AuthResponse refreshResult  = (AuthResponse) 
        accessTokenResponse.body();

        //save new access and refresh token
        sharedPreferenceManager.writeLoginResponse(context, 
        refreshResult);
       // then create a new request and modify it accordingly using the 
        new token
       return response.request().newBuilder()
            .header("Authorization", "Bearer " + 
       refreshResult.access_token)
            .build();

   } else {

     Login_.intent(context).flags(Intent.FLAG_ACTIVITY_NEW_TASK 
     | Intent.FLAG_ACTIVITY_CLEAR_TASK).start();
       return null;

   }
  }
 }

Нужно ли явно проверять в методе authenticate (), что я получаю 401? Похоже, это происходит, когда интернет-соединение нестабильно.

...