OkHttp Authenticator иногда не вызывает аутентификацию с несколькими экземплярами Retrofit - PullRequest
0 голосов
/ 15 октября 2018

У меня есть два разных экземпляра Retrofit для двух разных API.У меня также есть два разных клиента OkHttp3, но они используют один и тот же Authenticator, потому что токен аутентификации одинаков для обоих API.

Проблема заключается в том, что когда срок действия токена истекает, иногда (но почти всегда) один из объектов Retrofit / OkHttpClient не будет вызывать метод Authenticator authenticate в HTTP 401. Он с радостью выполнит вызовы API, и все закончится 401, и аутентификатор полностьюигнорируются.В этом случае, когда второй Retrofit совершает вызов API, он получает 401 и вызывается authenticate, токен обновляется, и все возвращается в нормальное состояние.Включая второй Retrofit API, который отказывал во всех вызовах с 401.

Более серьезная проблема заключается в том, что такое поведение является случайным, но сбой происходит более чем на половине срока действия токенов.Мы попробовали два Retrofit экземпляра с одним общим OkHttp3 клиентом, затем два OkHttp3 клиента с общими перехватчиками и аутентификатором и, наконец, также не разделяемые перехватчики и аутентификаторы.И даже в последнем случае, когда все имеет собственный экземпляр, аутентификация не вызывается при некоторых ошибках 401.

Interceptor s, они вводят старый токен в заголовки, просто Authenticator 's authenticate метод вызывается не при каждой ошибке HTTP 401.

При переходе через отладчик этого никогда не происходит, и всегда вызывается аутентификация.Это похоже на многопоточность для меня.Мгновенный запуск отключен в Android Studio.Запуск на реальном устройстве с Android 6.

РЕДАКТИРОВАТЬ: OkHttp 3.10.0, Retrofit 2.4.0, Android-компиляция SDK 27 и инструменты сборки 28.0.1

...