2016-12-27 4 views
0

J'exécute l'exemple Apache hc (client http) pour l'authentification Digest. Je ne change rien, juste en utilisant l'échantillon fourni:Echec de l'exemple du client http Apache pour l'authentification Digest

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

Et je reçois: HTTP/1.1 401 Unauthorized

Si je vais directement à http://httpbin.org/digest-auth/auth/user/passwd en moi des invites pour l'utilisateur/passwd et fournit la page. Donc, le site fonctionne correctement.

Une idée de ce qui ne va pas? J'ai la dernière version de la bibliothèque.

Fiddler Auth pour le navigateur (avec succès):

Pas-tête Proxy-Authorization est présent.

autorisation en-tête est présent: le nom d'utilisateur Digest = "user", realm = "[email protected]", nonce = "8ada87344eb5a10bf810bcc211205c24" uri = "/ digest-auth/auth/user/passwd" réponse = "ad22423e5591d14c90c6fe3cd762e64c", opaque = "361645844d957289c4c8f3479f76269f", qop = auth, nc = 00000001, cnonce = "260d8ddfe64bf32e"

Fiddler auth pour mon code (échoué):

No Proxy -Authorizati sur En-tête est présent.

autorisation en-tête est présent: le nom d'utilisateur Digest = "user", realm = "[email protected]", nonce = "76af6c9c0a1f57ee5f0fcade2a5f758c" uri = "http://httpbin.org/digest-auth/auth/user/passwd », réponse = "745686e3f38ab40ce5907d41f91823e6", qop = auth, nc = 00000001, cnonce = "634b618d5c8ac9af", algorithme = MD5, opaque = "fe84ce11c48a7b258490600800e5e6df"

Répondre

0

Ce code digestAuth.overrideParamter("realm", "some realm") devrait avoir des change.Pour remplacer "some realm" par le domaine de votre serveur.Veuillez regarder ce question

+0

Comment puis-je déterminer le domaine par programmation? Ce code est pour une bibliothèque qui fonctionnera sur de nombreux ordinateurs se connectant à de nombreux serveurs. Donc je ne peux pas le coder en dur. –

0

Ok, je l'ai fonctionné. Vous devez également définir un cookie. Thanks to this post pour l'aide. Le code ci-dessous fonctionne - mais seulement si vous êtes et non en utilisant Fiddler.

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