2012-03-21 10 views
5

の送信。資格情報を入力しないと、ログインフォームが表示されます。しかし、私が迷惑な基本認証の資格情報を提供した場合、私は直接目的のコンテンツにアクセスします。HTTP認証:力は私が認証を必要とあいまいなウェブサーバに話をする必要が挑戦

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でのダウンロードを行うことができますか?

は、ここで私はこれまで得たものです。 (そこも代わりにプロキシだ、と私はwget-Y onを使用して、私は、一致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プログラムで資格情報を送信する方法はありますか?

答えて

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;が必要ですが、今度は私たちがcredential-を削除することができます関連の輸入品。)

+0

素晴らしいアイデア、感謝します。フレームワークの解決策も私のためにうまくいかなかった。手動でヘッダーを追加しました。 –

+0

ありがとうございます。私はMaven HTTP Wagonクライアントにも同じ問題があり、ヘッダを手動で追加して解決しました。 –

+1

、今日あなただけの 'java.util.Base64.getEncoderを()を使用することができencodeToString(何か)'、 '輸入org.apache.commons.codec.binary.Base64に依存する必要はありません;' – eis

関連する問題