Authentication Processing in Okhttp

I use OkHttp 2.3 with basic authentication requests, according to OKHttp docs, it automatically repeats unauthorized requests, but whenever I provide invalid credentials, the request takes too much time and I get this exception at the end:

java.net.ProtocolException: Too many subsequent requests: 21

How can I prevent OkHttp from automatically repeating unauthorized requests and instead return 401 Unauthorized ?

+7
android authentication okio
source share
2 answers
 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 my Authenticator, I just count the attempts - after X tries, I make an exception.

+9
source

A modified version of Traxdata's answer that works:

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

Then you need to:

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

What is it.

+1
source

All Articles