Grundsätzlich, was ich tun muss, ist Digest-Authentifizierung durchzuführen. Das erste, was ich versuchte, ist das offizielle Beispiel zur Verfügung here. Aber wenn ich versuche, es auszuführen (mit einigen kleinen Änderungen, Post anstelle der die Get-Methode) Ich erhalte eineApache HttpClient Digest Authentifizierung
org.apache.http.auth.MalformedChallengeException: missing nonce in challange
at org.apache.http.impl.auth.DigestScheme.processChallenge(DigestScheme.java:132)
Als dies fehlschlug ich versucht, mit:
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());
Zuerst habe ich überschreibt nur die DigestScheme-Parameter "realm" und "nonce". Aber es stellte sich heraus, dass das PHP-Skript, das auf dem Server läuft, alle anderen Parameter benötigt, aber egal, ob ich sie spezifiziere oder nicht, DigestScheme generiert sie nicht in der Autorisierungs-RequestPreperty, wenn ich seine authenticate() -Methode aufruft. Und das PHP-Skript gibt den HTTP-Antwortcode 200 mit einer Meldung zurück, dass das PHP-Skript die Parameter cnonce, nc und qop benötigt.
Ich habe seit zwei Tagen damit zu kämpfen, und kein Glück. Basierend auf allem, was ich denke, ist das PHP-Skript die Ursache des Problems. Es scheint mir, dass es keine Herausforderung sendet, wenn die App versucht, unautorisiert darauf zuzugreifen.
Irgendwelche Ideen jemand?
Bearbeiten: Noch eine Sache, ich habe versucht, mit cURL verbinden und es funktioniert.
Sieht aus wie der Server nicht standardmäßige Herausforderungen sendet. Kannst du es im Browser versuchen und einen Header-Trace bekommen? –
Ich habe eine HttpURLConnection zum Server gemacht und die Antwortheader ausgedruckt. Im Folgenden sehen Sie, wie eine Herausforderung aussieht: Key = www-authenticate Wert = Digest Realm = "REST-API" qop = "auth" nonce = "4c063992df3dd" opak = "aba3d4b49c454e1974970e7b5514b001" – anqe1ki11er