2016-12-27 9 views
0

다이제스트 인증을 위해 샘플 Apache hc (http 클라이언트)를 실행하고 있습니다.Apache HTTP 클라이언트 샘플이 다이제스트 인증에 실패했습니다.

public static void main(String[] args) throws Exception { 
    HttpHost target = new HttpHost("httpbin.org", 80, "http"); 
    CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
    credsProvider.setCredentials(
      new AuthScope(target.getHostName(), target.getPort()), 
      new UsernamePasswordCredentials("user", "passwd")); 
    CloseableHttpClient httpclient = HttpClients.custom() 
      .setDefaultCredentialsProvider(credsProvider) 
      .build(); 
    try { 

     // Create AuthCache instance 
     AuthCache authCache = new BasicAuthCache(); 
     // Generate DIGEST scheme object, initialize it and add it to the local 
     // auth cache 
     DigestScheme digestAuth = new DigestScheme(); 
     // Suppose we already know the realm name 
     digestAuth.overrideParamter("realm", "[email protected]"); 
     // Suppose we already know the expected nonce value 
     digestAuth.overrideParamter("nonce", "b2c603bb7c93cfa197945553a1044283"); 
     authCache.put(target, digestAuth); 

     // Add AuthCache to the execution context 
     HttpClientContext localContext = HttpClientContext.create(); 
     localContext.setAuthCache(authCache); 

     HttpGet httpget = new HttpGet("http://httpbin.org/digest-auth/auth/user/passwd"); 

     System.out.println("Executing request " + httpget.getRequestLine() + " to target " + target); 
     for (int i = 0; i < 3; i++) { 
      CloseableHttpResponse response = httpclient.execute(target, httpget, localContext); 
      try { 
       System.out.println("----------------------------------------"); 
       System.out.println(response.getStatusLine()); 
       System.out.println(EntityUtils.toString(response.getEntity())); 
      } finally { 
       response.close(); 
      } 
     } 
    } finally { 
     httpclient.close(); 
    } 
} 

그리고 나는 점점 오전 : 난 그냥 제공된 샘플을 사용하여, 아무것도 변경하지 않은 HTTP를/1.1 401 권한

다음 제공 사용자/passwd에 나를하라는 메시지를 표시하고 내가이 http://httpbin.org/digest-auth/auth/user/passwd에 직접 갈 경우

그 페이지. 그래서 웹 사이트가 올바르게 작동합니다.

어떤 아이디어가 잘못 되었나요? 최신 버전의 라이브러리가 있습니다. (성공) 브라우저

피들러 인증 :

없음 프록시 인증 헤더가 존재합니다.

인증 헤더 존재한다 : 다이제스트 이름 = "사용자"= "[email protected]"난스 = "8ada87344eb5a10bf810bcc211205c24" 영역, URI = "/ 다이제스트 인증/인증/사용자/passwd에" 응답 = "ad22423e5591d14c90c6fe3cd762e64c" 불투명 = "361645844d957289c4c8f3479f76269f", QOP = 인증, NC = 00000001, cnonce = "260d8ddfe64bf32e"

피들러 인증 내 코드 (실패) :

프록시 없음 - 인증 헤더가 있음.

인증 헤더가 : 다이제스트 이름 = "사용자"= "[email protected]"난스 = "76af6c9c0a1f57ee5f0fcade2a5f758c" 영역, URI = "http://httpbin.org/digest-auth/auth/사용자/passwd에 " 응답 ="745686e3f38ab40ce5907d41f91823e6 ", QOP = 인증, NC = 00000001, cnonce ="634b618d5c8ac9af ", 알고리즘 = MD5, 불투명 ="fe84ce11c48a7b258490600800e5e6df "

답변

0

digestAuth.overrideParamter("realm", "some realm") 일부가 있어야이 코드 변경하십시오. "some realm"을 서버 영역으로 대체하십시오.이 부분을 보시려면 question

0을 입력하십시오.
+0

프로그래밍 방식으로 영역을 어떻게 결정합니까? 이 코드는 여러 서버에 연결되는 많은 컴퓨터에서 실행되는 라이브러리 용 코드입니다. 그래서 나는 그것을 하드 코딩 할 수 없다. –

0

알았어. 쿠키도 설정해야합니다. 도움말은 Thanks to this post입니다. 아래 코드는 작동하지만 - 이 아닌 경우에만 피들러를 사용합니다.

public static void main(String[] args) throws Exception { 

     CookieStore cookieStore = new BasicCookieStore(); 
     BasicClientCookie cookie = new BasicClientCookie("fake", "fake_value"); 
     cookie.setDomain("httpbin.org"); 
     cookie.setPath("/"); 
     cookieStore.addCookie(cookie); 

     // https://stackoverflow.com/questions/27291842/digest-auth-with-java-apache-client-always-401-unauthorized 

     HttpHost target = new HttpHost("httpbin.org", 80, "http"); 
     CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     credsProvider.setCredentials(
       new AuthScope(target.getHostName(), target.getPort()), 
       new UsernamePasswordCredentials("user", "passwd")); 

     CloseableHttpClient httpclient = HttpClients.custom() 
       .setDefaultCookieStore(cookieStore) 
       .setDefaultCredentialsProvider(credsProvider) 
//    .setProxy(new HttpHost("127.0.0.1", 8888)) 
       .build(); 
     try { 

      // Create AuthCache instance 
      AuthCache authCache = new BasicAuthCache(); 
      // Generate DIGEST scheme object, initialize it and add it to the local 
      // auth cache 
      DigestScheme digestAuth = new DigestScheme(); 
      // Suppose we already know the realm name 
      digestAuth.overrideParamter("realm", "[email protected]"); 
      // Suppose we already know the expected nonce value 
      digestAuth.overrideParamter("nonce", calculateNonce()); 
      authCache.put(target, digestAuth); 

      // Add AuthCache to the execution context 
      HttpClientContext localContext = HttpClientContext.create(); 
      localContext.setAuthCache(authCache); 

      HttpGet httpget = new HttpGet("http://httpbin.org/digest-auth/auth/user/passwd"); 

      System.out.println("Executing request " + httpget.getRequestLine() + " to target " + target); 
       CloseableHttpResponse response = httpclient.execute(target, httpget, localContext); 
       try { 
        System.out.println("----------------------------------------"); 
        System.out.println(response.getStatusLine()); 
        System.out.println(EntityUtils.toString(response.getEntity())); 
       } finally { 
        response.close(); 
       } 
     } finally { 
      httpclient.close(); 
     } 
    } 

    public static synchronized String calculateNonce() { 

     Date d = new Date(); 
     SimpleDateFormat f = new SimpleDateFormat("yyyy:MM:dd:hh:mm:ss"); 
     String fmtDate = f.format(d); 
     Random rand = new Random(100000); 
     Integer randomInt = rand.nextInt(); 
     return org.apache.commons.codec.digest.DigestUtils.md5Hex(fmtDate + randomInt.toString()); 
    }