基本的に私がする必要があるのはダイジェスト認証を実行することです。私が最初に試したのは、ここで入手できる公式の例です。しかし、それを実行しようとすると(いくつかの小さな変更を加えて、Getメソッドの代わりにPost)、
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());
最初は、「レルム」と「ノンス」のDigestSchemeパラメーターのみをオーバーライドしました。しかし、サーバーで実行されているPHPスクリプトには他のすべてのパラメーターが必要であることが判明しましたが、それらを指定するかどうかに関係なく、authenticateSchemeはauthenticate()メソッドを呼び出したときにAuthorizationRequestPrepertyでそれらを生成しません。また、PHPスクリプトはHTTP応答コード200を返し、PHPスクリプトにはcnonce、nc、およびqopパラメーターが必要であるというメッセージが表示されます。
私はこれに2日間苦労してきましたが、運がありません。すべてに基づいて、問題の原因はPHPスクリプトにあると思います。アプリが不正にアクセスしようとしても、チャレンジは送信されないように見えます。
誰かアイデアはありますか?
編集:もう1つ、cURLで接続してみましたが、機能します。