У меня есть аутентификатор, который, я полагаю, должен запускаться только тогда, когда есть 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?
Похоже, это происходит, когда интернет-соединение нестабильно.