2015-04-05 33 views
7

Używam OkHttp 2.3 z podstawowymi żądaniami uwierzytelnienia, zgodnie z dokumentami OKHttp, to automatycznie ponawia nieuwierzytelnione żądania, ale ilekroć podaję nieprawidłowe dane, prośba zajmuje zbyt wiele czasu i na końcu otrzymuję ten wyjątek:Obsługa uwierzytelniania w Okhttp

java.net.ProtocolException: Zbyt wiele następcze wnioski: 21

Jak mogę zapobiec OkHttp automatyczne ponawianie próby nieuwierzytelnionych wniosków i powrót 401 Unauthorized zamiast?

Odpowiedz

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; 
     } 
    }; 
} 

W moim Authenticator po prostu liczę próby - po X próbach, wyrzucam wyjątek.

+0

Wielkie dzięki, właśnie to zrobiłem, niestety, nie udało mi się wyłączyć wielu prób w Okhttp. –

1

Zmodyfikowana wersja odpowiedzi Traxdata, że ​​działa:

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(); 
      } 
     } 
    }; 
} 

Następnie trzeba:

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(); 

To wszystko.