HTTP-аутентификация с Apache HTTP Components: принудительная отправка вызова - PullRequest
5 голосов
/ 21 марта 2012

Мне нужно поговорить с неизвестным веб-сервером, который требует аутентификации. Если я не предоставляю учетные данные, отображается форма входа. Однако, если я предоставляю незапрошенные учетные данные Basic Authentication, я сразу получаю нужный контент.

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

Теперь мой вопрос: как я могу сделать загрузку в Java, используя HTTP-компоненты Apache?

Вот что я получил до сих пор. (Также имеется прокси, и я использую -Y on в wget, и у меня есть соответствующая переменная окружения 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 отправлять учетные данные?

1 Ответ

10 голосов
/ 21 марта 2012

Неважно. Я решил проблему, не пытаясь использовать какие-либо методы проверки подлинности библиотеки, а просто перебор заголовка Basic Authentication в запросе:

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;, но в свою очередь мы можем удалить импорт, связанный с учетными данными.)

...