2016-08-03 25 views
2

目前我的客戶只有401響應的情況下,認證要求:啓用認證手動

this.client.authenticator(new okhttp3.Authenticator() { 

     public Request authenticate(Route route, Response response) throws IOException { 
     String credentials = authenticator.getCredentials(); 
     if (credentials.equals(response.request().header("Authorization"))) { 
      throw new TraversonException(401, "Unauthorized", response.request().url().toString()); 
     } else { 
      defaultHeader("Authorization", credentials); 

      Request.Builder newRequest = response.request().newBuilder() 
           .headers(Headers.of(defaultHeaders)); 

      return newRequest.build(); 
     } 
}); 

但我想改變這種行爲,並能夠手動或每一次調用自動調用它呢?以某種方式可能嗎?

回答

2

如果身份驗證是可預測需要的並且與代理無關,那麼解決方案是實現Interceptor而不是Authenticator。

OkHttpClient.Builder clientBuilder = ...; 
clientBuilder.networkInterceptors().add(0, myInterceptor); 
client = clientBuilder.build(); 

例攔截https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/authenticator/ServiceInterceptor.java

N.B.圍繞https://github.com/square/okhttp/pull/2458這個用例的可能支持進行了討論。當前Authenticator API的一個問題是它假定來自失敗(401)請求的響應。

+0

此外,我們希望在未來的版本中實施先發制人的身份驗證。 –