Básicamente lo que tengo que hacer es realizar autenticación resumida. Lo primero que intenté fue el ejemplo oficial disponible here. Pero cuando intento ejecutarlo (con algunos pequeños cambios, Post en lugar del método del GET) me siento unApache HttpClient autenticación implícita
org.apache.http.auth.MalformedChallengeException: missing nonce in challange
at org.apache.http.impl.auth.DigestScheme.processChallenge(DigestScheme.java:132)
Cuando esto falló Intenté usar:
DefaultHttpClient client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(new AuthScope(null, -1, null), new UsernamePasswordCredentials("<username>", "<password>"));
HttpPost post = new HttpPost(URI.create("http://<someaddress>"));
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("domain", "<username>"));
post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
DigestScheme digestAuth = new DigestScheme();
digestAuth.overrideParamter("algorithm", "MD5");
digestAuth.overrideParamter("realm", "http://<someaddress>");
digestAuth.overrideParamter("nonce", Long.toString(new Random().nextLong(), 36));
digestAuth.overrideParamter("qop", "auth");
digestAuth.overrideParamter("nc", "0");
digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce());
Header auth = digestAuth.authenticate(new
UsernamePasswordCredentials("<username>", "<password>"), post);
System.out.println(auth.getName());
System.out.println(auth.getValue());
post.setHeader(auth);
HttpResponse ret = client.execute(post);
ByteArrayOutputStream v2 = new ByteArrayOutputStream();
ret.getEntity().writeTo(v2);
System.out.println("----------------------------------------");
System.out.println(v2.toString());
System.out.println("----------------------------------------");
System.out.println(ret.getStatusLine().getReasonPhrase());
System.out.println(ret.getStatusLine().getStatusCode());
Al principio tengo solo reemplazó los parámetros "DigestScheme" del "reino" y "nonce". Pero resultó que las secuencias de comandos PHP que se ejecutan en el servidor requieren todos los demás parámetros, pero no importa si los especifico o no, DigestScheme no los genera en la Solicitud de AutorPrepertura cuando llamo a su método authenticate(). Y el script PHP devuelve el código de respuesta HTTP 200 con un mensaje que el script PHP requiere los parámetros cnonce, nc y qop.
He estado luchando con esto durante dos días, y sin suerte. Basado en todo, creo que la causa del problema es el script PHP. Me parece que no envía un desafío cuando la aplicación intenta acceder a él sin autorización.
¿Alguna idea a alguien?
Edit: Una cosa más, he intentado conectar con cURL y funciona.
Parece que el servidor está enviando desafíos no estándar. ¿Puedes probarlo en el navegador y obtener un seguimiento del encabezado? –
He hecho una HttpURLConnection al servidor e imprimí los encabezados de respuesta. A continuación se muestra el aspecto de una impugnación: Key = www-authenticate Value = Digest realm = "API REST" qop = "auth" nonce = "4c063992df3dd" opaque = "aba3d4b49c454e1974970e7b5514b001" – anqe1ki11er