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"
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. –