2016-12-27 1 views
0

Ich führe das Beispiel Apache hc (http-Client) für Digest-Authentifizierung. Ich habe nichts ändern, nur die bereitgestellte Probe mit:Apache HTTP-Client-Beispiel für Digest-Authentifizierung fehlgeschlagen

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

Und ich erhalte: HTTP/1.1 401 Unauthorized

Wenn ich http://httpbin.org/digest-auth/auth/user/passwd direkt gehen in mich aufgefordert, für Benutzer/passwd und dann liefert Die Seite. Die Website funktioniert also richtig.

Irgendeine Idee, was ist falsch? Ich habe die neueste Version der Bibliothek.

Fiddler Auth für Browser (erfolgreich):

Kein Proxy-Authorization-Header vorhanden ist.

Authorization-Header vorhanden ist: Digest username = "user", realm = "[email protected]" Nonce = "8ada87344eb5a10bf810bcc211205c24" uri = "/ Digest-auth/auth/user/passwd", Antwort = "ad22423e5591d14c90c6fe3cd762e64c", opak = "361645844d957289c4c8f3479f76269f", qop = Auth, nc = 00000001, cnonce = "260d8ddfe64bf32e"

Fiddler Auth für meinen Code (nicht):

Kein Proxy -Authorizati auf Header ist vorhanden.

Authorization-Header vorhanden ist: Digest username = "user", realm = "[email protected]" Nonce = "76af6c9c0a1f57ee5f0fcade2a5f758c" uri = "http://httpbin.org/digest-auth/auth/user/passwd“, response = "745686e3f38ab40ce5907d41f91823e6", qop = auth, nc = 00000001, cnonce = "634b618d5c8ac9af", algorithm = MD5, opak = "fe84ce11c48a7b258490600800e5e6df"

Antwort

0

Dieser Code digestAuth.overrideParamter("realm", "some realm") einige haben sollte change.To ersetzen "some realm" von Ihrem Server Realm.Bitte schauen Sie sich diese question

+0

Wie kann ich das Realm programmatisch ermitteln? Dieser Code gilt für eine Bibliothek, die auf vielen Computern mit vielen Servern ausgeführt wird. Also kann ich es nicht hart codieren. –

0

Ok, ich habe es funktioniert. Sie müssen auch einen Cookie setzen. Thanks to this post für die Hilfe. Der folgende Code funktioniert - aber nur wenn Sie nicht mit Fiddler sind.

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