2015-04-05 4 views
7

Я использую OkHttp 2.3 с базовыми запросами на аутентификацию, согласно документам OKHttp, он автоматически повторяет запросы, не прошедшие проверку подлинности, но когда я предоставляю неверные учетные данные, запрос занимает слишком много времени, и я получаю это исключение в конце:Обработка аутентификации в Okhttp

java.net.ProtocolException: Слишком много последующих запросов: 21

Как я могу предотвратить OkHttp от автоматически повторно сделать анонимные запросов, и вернуться 401 Unauthorized вместо этого?

ответ

9
protected Authenticator getBasicAuth(final String username, final String password) { 
    return new Authenticator() { 
     private int mCounter = 0; 

     @Override 
     public Request authenticate(Proxy proxy, Response response) throws IOException { 
      if (mCounter++ > 0) { 
       throw new AuthenticationException(
         AuthenticationException.Type.INVALID_LOGIN, response.message()); 
      } 

      String credential = Credentials.basic(username, password); 
      return response.request().newBuilder().header("Authorization", credential).build(); 
     } 

     @Override 
     public Request authenticateProxy(Proxy proxy, Response response) throws IOException { 
      return null; 
     } 
    }; 
} 

В моем аутентификаторе я просто считаю попытки - после того, как X пытается, я делаю исключение.

+0

Большое спасибо, это то, что я в конечном итоге сделал в любом случае, ничего, чтобы отключить несколько испытаний в Okhttp, найденных до сих пор. –

1

Модифицированная версия ответа TRAXDATA, что работает:

protected Authenticator getBasicAuth(final String username, final String password) { 
    return new Authenticator() { 
     private int mCounter = 0; 

     @Override 
     public Request authenticate(Route route, Response response) throws IOException { 
      Log.d("OkHttp", "authenticate(Route route, Response response) | mCounter = " + mCounter); 
      if (mCounter++ > 0) { 
       Log.d("OkHttp", "authenticate(Route route, Response response) | I'll return null"); 
       return null; 
      } else { 
       Log.d("OkHttp", "authenticate(Route route, Response response) | This is first time, I'll try to authenticate"); 
       String credential = Credentials.basic(username, password); 
       return response.request().newBuilder().header("Authorization", credential).build(); 
      } 
     } 
    }; 
} 

Тогда вам нужно:

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.authenticator(getBasicAuth("username", "pass")); 
retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .client(builder.build()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

Вот так.

Смежные вопросы