2012-03-21 22 views
5

Muszę porozmawiać z niezrozumiałym serwerem internetowym, który wymaga uwierzytelnienia. Jeśli nie dostarczę poświadczeń, wyświetli się formularz logowania. Jeśli jednak dostarczę niezamówione poświadczenia Basic Authentication, przejdę bezpośrednio do żądanej treści.Uwierzytelnianie HTTP za pomocą komponentów Apache HTTP: wymuszanie wysyłania wiadomości

wget obsługuje to bezpośrednio:

# 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 

Teraz moje pytanie: W jaki sposób można dokonać pobrania w języku Java z wykorzystaniem komponentów HTTP Apache?

Oto, co dostałem do tej pory. (Jest również pełnomocnikiem w miejscu, a używam -Y on w wget i mam pasujący https_proxy zmienną środowiskową.)

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 

Jednak tylko skończyć ze strony formularza logowania, a nie rzeczywista dokumentu. Podejrzewam, że DefaultHttpClient nie wysyła poświadczeń niezamawianych, tak jak robi to wget. Czy istnieje sposób, aby program Java wysłał poświadczenia?

Odpowiedz

10

Nieważne. I rozwiązać problem przez nie próbuje stosować żadnych metod uwierzytelniania biblioteka, ale po prostu brute-zmuszając nagłówka uwierzytelniania podstawowego do wniosku:

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 

(To wymaga dodatkowego import org.apache.commons.codec.binary.Base64;, ale z kolei możemy usunąć credential- powiązany przywóz).

+0

Świetny pomysł, dzięki. Rozwiązanie ramowe też mi nie pasowało. Ręczne dodawanie nagłówka działało. –

+0

Dzięki. Miałem ten sam problem z klientem Maven HTTP Wagon i rozwiązałem go ręcznie, dodając nagłówek. –

+1

w dzisiejszych czasach można po prostu użyć 'java.util.Base64.getEncoder(). EncodeToString (coś)', nie trzeba polegać na 'import org.apache.commons.codec.binary.Base64;' – eis

Powiązane problemy