Android запрос повторной модификации после истечения срока действия токена? - PullRequest
0 голосов
/ 27 марта 2020

Я использую 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 везде)

1 Ответ

0 голосов
/ 27 марта 2020

После ответа при входе в систему сохраните токен, затем перенесите этот токен для связи с сервером, чтобы пользователю больше не приходилось входить в систему.

Когда приложение получает ответ типа «401: просроченный токен» во время любого запроса, просто удалите сохраненный токен и все пользовательские данные и откройте диалоговое окно, позволяющее пользователю перейти к LoginActivity. Затем повторите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...