как содержать заголовок при перенаправлении в модернизации

#android #redirect #retrofit2 #oauth2 #okhttp3

#Android #перенаправление #retrofit2 #oauth-2.0 #okhttp

Вопрос:

Я попытался создать oauth2 для приложения Android. в нем есть небольшая ошибка.

Моя ошибка в том, что при перенаправлении у него нет заголовка, подобного авторизации

MyCookieCode. Он отправляет авторизацию при входе в систему. но это не работает, когда я перенаправляю

 public static Retrofit getLoginRetrofitOnAuthz() {
    Retrofit.Builder builder = new Retrofit.Builder().baseUrl(ServerValue.AuthServerUrl).addConverterFactory(GsonConverterFactory.create());
    if (LoginRetrofitAuthz == null) {
        httpClientAuthz.addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {

                String str = etUsername.getText().toString()   ":"   etPassword.getText().toString();
                String Base64Str = "Basic "   Base64.encodeToString(str.getBytes(), Base64.NO_WRAP);
                System.out.println(Base64Str);
                Request request = chain.request().newBuilder().addHeader("Authorization", Base64Str).build();

                return chain.proceed(request);
            }
        });   
        CookieManager cookieManager = new CookieManager();
        cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
        httpClientAuthz.cookieJar(new JavaNetCookieJar(cookieManager));

        LoginRetrofitAuthz = builder.client(httpClientAuthz.build()).build();
    }
    return LoginRetrofitAuthz;
}
  

Результат сервера (верхний логин, нижний, перенаправление)
введите описание изображения здесь

Знаете ли вы, как сохранить заголовок при перенаправлении?

Ответ №1:

на самом деле грешник — это OkHttp, но не Retrofit. OkHttp специально удаляет все заголовки аутентификации:

https://github.com/square/okhttp/blob/7cf6363662c7793c7694c8da0641be0508e04241/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java

 // When redirecting across hosts, drop all authentication headers. This
// is potentially annoying to the application layer since they have no
// way to retain them.
if (!sameConnection(url)) {
  requestBuilder.removeHeader("Authorization");
}
  

Вот обсуждение этой проблемы: https://github.com/square/retrofit/issues/977

Вы могли бы использовать аутентификатор OkHttp. Он будет вызван, если будет возвращена ошибка 401. Таким образом, вы можете использовать его для повторной аутентификации запроса.

 httpClient.authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                return response.request().newBuilder()
                        .header("Authorization", "Token "   DataManager.getInstance().getPreferencesManager().getAuthToken())
                        .build();
            }
        });
  

Однако в моем случае сервер вернул 403 Forbidden вместо 401. И мне пришлось получить
response.headers().get("Location");

на месте, создайте и запустите другой сетевой запрос:

public Call<Response> getMoreBills(@Header("Authorization") String authorization, @Url String nextPage)

Комментарии:

1. в моем случае сервер вернул 200 после перенаправления. Как сделать другой запрос, если код является кодом успеха?