10

Tôi đang cố gắng để làm Digest chủ yếu (hoặc cơ bản) Xác thực bằng RestTemplatehttpclient (4.x).RestTemplate cơ bản hoặc tiêu hóa xác thực với httpclient hiện tại (4.x)

Vì tôi không thể tìm thấy bất kỳ ví dụ liên quan nào về cách thực hiện điều này, tôi đã thử nhiều cách để móc các tạo phẩm http khác nhau, không may mắn - về cơ bản, không có tiêu đề Chứng thực.

thực hiện hiện tại của tôi là:

DefaultHttpClient newHttpClient = new DefaultHttpClient(); 
Credentials credentials = new UsernamePasswordCredentials(username, password); 
AuthScope authScope = new AuthScope(host, port, AuthScope.ANY_REALM); 
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(authScope, credentials); 
newHttpClient.setCredentialsProvider(credentialsProvider); 

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(newHttpClient); 
restTemplate.setRequestFactory(requestFactory); 

Có cái gì tôi đang làm sai? Có cũng là một ví dụ làm việc cho điều này bất cứ nơi nào? Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn.

+0

Bạn có đăng nhật ký chi tiết hơn về các yêu cầu và phản hồi HTTP không? Sẽ rất hữu ích khi xác nhận những thứ như thử thách xác thực trước khi cố khắc phục sự cố mã máy khách của bạn. – jtoberon

+1

Hy vọng rằng sẽ không có thách thức - tôi muốn có xác thực ưu tiên. Đối với các mã khách hàng - Tôi thực sự tìm kiếm bất kỳ thiết lập với Spring RestTemplate và HTTPClient (4.x) hoạt động. – Eugen

Trả lời

9

Hãy thử triển khai RequestFactory của riêng bạn để đạt được xác thực trước.

public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { 

public PreEmptiveAuthHttpRequestFactory(DefaultHttpClient client) { 
    super(client); 
} 

@Override 
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { 
    AuthCache authCache = new BasicAuthCache(); 
    BasicScheme basicAuth = new BasicScheme(); 
    HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort()); 
    authCache.put(targetHost, basicAuth); 
    BasicHttpContext localcontext = new BasicHttpContext(); 
    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 

    return localcontext; 
} 
} 

Một sau đó chỉ cần sử dụng nó:

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(newHttpClient); 

Hy vọng nó giúp


làm thế nào để thiết lập tên người dùng và mật khẩu (Sao chép từ bình luận @ bifur của)

Bạn có thể sử dụng UserNamePasswordCredentials

UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(getUsername(),getPassword()); 
client.getCredentialsProvider().setCredentials(new AuthScope(getHost(), getPort(), AuthScope.ANY_REALM), credentials); 

Và chỉ cần sử dụng khách hàng tại nhà máy trước

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(client); 
+0

Tôi sẽ cung cấp cho nó một đi và cho bạn biết làm thế nào nó quay ra - cảm ơn. – Eugen

+0

Một lần theo dõi nhanh - chính xác tên người dùng và mật khẩu đã được đặt như thế nào? – Eugen

+3

Bạn có thể sử dụng UserNamePasswordCredentials 'UsernamePasswordCredentials credentials = new UsernamePasswordCredentials (getUsername(), getPassword()); . client.getCredentialsProvider() setCredentials (AuthScope mới (getHost(), getPort(), AuthScope.ANY_REALM), chứng chỉ); ' Và chỉ cần sử dụng khách hàng tại nhà máy trước 'HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory (khách hàng); ' – bifur

0

tôi sửa đổi câu trả lời ban đầu một chút:

  • thêm https hỗ trợ
  • cập nhật thứ depracated

    public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { 
    
        public PreEmptiveAuthHttpRequestFactory(HttpClient client) { 
         super(client); 
        } 
    
        @Override 
        protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { 
         AuthCache authCache = new BasicAuthCache(); 
         BasicScheme basicAuth = new BasicScheme(); 
         HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()); 
         authCache.put(targetHost, basicAuth); 
         HttpClientContext localContext = HttpClientContext.create(); 
         localContext.setAuthCache(authCache); 
         return localContext; 
        } 
    } 
    
Các vấn đề liên quan