2012-03-02 2 views
12

HTTPClient 버전 4.1.2를 사용하여 기본 인증이 필요한 REST over HTTP API에 액세스하려고했습니다. 전송되는 두 요청이 있다는 것을Basic 인증을 사용하면 HTTPClient가 두 개의 요청을 보냅니 까?

HttpPost request = new HttpPost("http://my/url"); 
request.addHeader(new BasicHeader("Content-type", "application/atom+xml; type=entry")); // required by vendor 
request.setEntity(new StringEntity("My content")); 

HttpResponse response = client.execute(request); 

내가 Charles Proxy에서 볼 :

DefaultHttpClient httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager()); 
// Enable HTTP Basic Auth 
httpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials(this.username, this.password)); 

HttpHost proxy = new HttpHost(this.proxyURI.getHost(), this.proxyURI.getPort()); 

httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy); 

나는 POST 요청을 구성

,이 같은 : 다음은 클라이언트 코드입니다. 하나는 Authorization: Basic ... 헤더가없고 입니다. 첫 번째 것은 401에서 실패하지만 두 번째는 201로 끝납니다.

왜 이런 일이 일어나는 지 알고 계십니까? 감사!

편집 :

나는 이미 this question 보았다 것을 분명히해야하지만, 당신이 볼 수 있듯이 나는 AuthScope 같은 방법으로 설정하고 내 문제가 해결되지 않았다. 또한 새 요청을 만들 때마다 새로운 HttpClient을 만들지 만 여러 요청에 동일한 HttpClient을 사용하더라도 문제가 계속 발생합니다.

편집 2 : 무엇 @LastCoder이 제안 된 것은 할 수있는 방법처럼

그래서 보인다. 다른 질문은 this answer을 참조하십시오. 문제는 HTTP 사양에 대한 지식 부족 때문입니다. 내가하고 싶은 것은 "선매 인증"이라고하며 HttpClientdocs mention it here입니다. 고맙게도, 위의 대답은 훨씬 짧고 깨끗한 방법입니다.

+1

자격 증명을 지정했지만 soap-ui 이벤트를 사용할 때도 똑같은 일이 일어났습니다. – Harindaka

+0

이것이 정상적인 동작인지 궁금합니다. 클라이언트는 인증을 가정하지 않고 http 요청을하고 401을 통해 기본 인증이 필요하다는 메시지를받습니다. 이론적으로 기본 인증은 선점 할 수 있지만 다른 인증 스키마 (예 : 다이제스트)는 추가 협상이 필요합니다. – seand

+0

@seand 여러분은 제가 실제로 그것을 고려했음을 알고 있지만 HTTP 프로토콜이나 그와 유사한 것이 있는지 여부는 알 수 없습니다. – daveslab

답변

10

오히려 그냥 USERNAME 인코딩하지 않는 이유) (.setCredentials를 사용하는 것보다 : PASSWORD를하고

+0

나는 그것을 할 수 있었고, 그렇게 할 수 있는지 테스트해볼 것이지만, HttpClient 레포의 예제 코드 (http://bit.ly/wEsEhY)에 따르면, 그렇게해야한다. 그것. – daveslab

+7

@daveslab - 리소스를 익명으로 요청하고 권한 부여 헤더를 사용하여 401에 응답하는 것은 http 클라이언트 사양의 일부입니다. 클라이언트가 권한 헤더 자격 증명이있는 웹 서버를 스팸으로 보내지 않는 경우 웹 서버는 필요하지 않습니다. 그것은 기본적인 보안 베스트 프랙티스 일뿐입니다. –

+0

그것은 무차별 대입 솔루션이지만 필요하다면 (예 : 서버가 다이제스트 인증을 사용하도록 변경 한 경우) – seand

2

이것은 서버/대상 엔드 포인트는 모든 새 세션을 만들 것을 의미 .addHeader()와 함께 인증 헤더를 추가 클라이언트 요청. 이것은 당신의 모든 요청을 손으로 흔드는 것을 강요합니다. 즉, 고객이 먼저 전화를 걸어 인증이 필요하다는 것을 알게되면 승인이 뒤따라야합니다. 당신이해야 할 일은 다음과 같이 선점 적으로 승인을 보내는 것입니다 :

httpClient.getParams(). setAuthenticationPreemptive (true);

프로세스를 이해하기 만하면 클라이언트 요청 헤더를 기록하여 클라이언트가 보내고받는 내용을 알 수 있습니다. 이것이 작동하는지 확인하십시오.

관련 문제