2012-03-21 3 views
5

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

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 с помощью Apache HTTP в компоненты?

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

ответ

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 (что-то)', не нужно зависеть от 'import org.apache.commons.codec.binary.Base64;' – eis

Смежные вопросы