2015-04-05 6 views
7

Ich benutze OkHttp 2.3 mit grundlegenden Authentifizierungsanforderungen, nach OKHttp docs, es automatisch nicht authentifizierte Anfragen, aber jedes Mal, wenn ich ungültige Anmeldeinformationen, die Anfrage dauert zu viel Zeit und ich bekomme diese Ausnahme am Ende:Authentifizierung in Okhttp

java.net.ProtocolException: Zu viele Follow-up-Anfragen: 21

Wie kann ich OkHttp automatisch erneut versucht nicht authentifizierte Anforderungen zu verhindern, und das Rück 401 Unauthorized statt?

Antwort

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

In meinem Authenticator zähle ich einfach die Versuche - nach X versuche ich eine Ausnahme zu werfen.

+0

Vielen Dank, das ist, was ich am Ende getan habe, nichts, um mehrere Versuche in Okhttp bisher zu deaktivieren. –

1

modifizierte Version Antwort des Traxdata, das funktioniert:

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

Dann müssen Sie:

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

Das ist es.