Я использую Retrofit для связи с моим сервером. Сначала мне нужно вызвать конечную точку входа в систему, затем я получил повар ie (токен авторизации), который я сохраняю автоматически, и следующие запросы разрешаются. Этот «сеанс» истекает, если нет запроса в течение 1 часа.
Как мне выполнить автоматическую аутентификацию c? Очевидно, что это не очень хорошая идея, что я проверяю конечный ответ на вход в систему с именем пользователя / паролем перед каждым «реальным» запросом, чтобы убедиться, что мой клиент еще не истек.
Я попытался добавить перехватчик в okHttpClient, и проверьте, получает ли мой «реальный» ответ (не логин) код возврата 401. В этом случае я должен позвонить в конечную точку входа в систему, а после этого мне придется повторить «реальный» вызов.
Как можно Я «сохраняю» запрос, вызываю логин, и после этого повторяю первый запрос, когда я снова аутентифицируюсь?
private static Retrofit retrofit;
public static Retrofit getClient( final Context context ) {
if ( retrofit == null ) {
ClearableCookieJar cookieJar =
new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
final OkHttpClient okHttpClient =
new OkHttpClient.Builder()
.followSslRedirects(false)
.followRedirects(false)
.cookieJar(cookieJar)
.addInterceptor(chain -> {
Request request = chain.request();
Response response = chain.proceed(request);
if ( response.code() == 401 ) {
if ( !response.message().contains("Incorrect") ) {
// THIS IS THE CASE, when I try to call an endpoint with expired token
// I need to call login again, and then repeat this failed request
}
}
return response;
})
.build();
retrofit = new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
Очевидно, что я могу вручную проверять код ответа на каждый запрос, и если это 401, я звоню войдите в систему, и когда это будет сделано, я снова позвоню. Но я надеюсь, что есть более простое (встроенное решение с перехватчиками, поэтому мне не нужно внедрять эту логику c везде)