我需要做的基本上是执行摘要认证。 我尝试的第一件事是使用这里提供的官方示例。但是当我尝试执行它时(进行了一些小更改,使用Post方法而不是Get方法),我遇到了一个
org.apache.http.auth.MalformedChallengeException: missing nonce in challange
at org.apache.http.impl.auth.DigestScheme.processChallenge(DigestScheme.java:132)
当这种方法失败后,我尝试使用:
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());
一开始我只覆盖了“realm”和“nonce”DigestScheme参数。但后来发现运行在服务器上的PHP脚本需要所有其他参数,但无论我是否指定它们,DigestScheme都不会在调用其authenticate()方法时在Authorization RequestPreperty中生成它们。而PHP脚本返回HTTP响应代码200,并带有一条消息,指出PHP脚本需要cnonce、nc和qop参数。
我已经苦苦挣扎两天了,也没有什么进展。根据我所知道的一切,问题的根源是PHP脚本。我觉得它在未经授权的情况下尝试访问它时没有发送挑战(challenge)。
有任何想法吗?
编辑: 还有一件事,我已经尝试使用cURL连接,它可以正常工作。