5

認証が必要なあいまいなWebサーバーと通信する必要があります。クレデンシャルを入力しないと、ログインフォームが表示されます。ただし、一方的な基本認証の資格情報を提供すると、目的のコンテンツに直接アクセスできます。

wgetこれを直接サポートします:

# this fails and downloads a form:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh

# this works and downloads the document:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge

今私の質問:ApacheのHTTPコンポーネントを使用してJavaでダウンロードするにはどうすればよいですか?

これが私がこれまでに得たものです。(プロキシも配置されており、で使用-Y onwgetており、一致するhttps_proxy環境変数があります。)

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import java.net.URI;

// ...

DefaultHttpClient hc = new DefaultHttpClient();
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port));

URI uri = new URI("https://weird.egg/data.txt");

hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh"));

hc.execute(new HttpGet(uri)); // etc

ただし、実際のドキュメントではなく、ログインフォームページだけが表示されます。DefaultHttpClientが、そのように、未承諾のクレデンシャルを送信していないのではないかと疑ってwgetいます。Javaプログラムにクレデンシャルを送信させる方法はありますか?

4

1 に答える 1

10

どうでも。ライブラリ認証方法を使用しようとせず、基本認証ヘッダーをリクエストにブルートフォースするだけで問題を解決しました。

HttpGet get = new HttpGet(uri);

String basic_auth = new String(Base64.encodeBase64((username + ":" + password).getBytes()));
get.addHeader("Authorization", "Basic " + basic_auth);

hc.execute(get); // etc

(これには追加import org.apache.commons.codec.binary.Base64;の が必要ですが、資格情報関連のインポートを削除できます。)

于 2012-03-21T13:53:31.007 に答える