OkHttp Authenticator иногда не вызывает аутентификацию с несколькими экземплярами Retrofit
У меня два разных Retrofit
экземпляры для двух разных API. У меня тоже есть два разных OkHttp3
клиенты, но они разделяют одно и то же Authenticator
потому что токен аутентификации одинаков для обоих API.
Проблема в том, что когда срок действия токена истекает, иногда (но почти всегда) один из Retrofit
/OkHttpClient
объекты не будут вызывать Authenticator
"s 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