2009-08-31 10 views
34

Próbuję wysłać GET poprzez HttpURLConnection (importowane z org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection), a po otrzymaniu odpowiedzi, IOException jest wyrzucany z Androidem :IOException: "Received wyzwanie uwierzytelnienia jest pusta" (Apache Harmony/Android)

w doRequestInternal(): "Received wyzwanie uwierzytelniania jest null"

co oznacza ten błąd znaczy, i co jest tego przyczyną? Piszę parametry OAuth do nagłówka Authorization, ale robię to również przy innych okazjach, bez problemów.

if (connection == null) { 
     connection = (HttpURLConnection) new URL(endpointUrl).openConnection(); 
     connection.setRequestMethod("GET"); 
    } 

    //... do some OAuth message signing 

    connection.connect(); 

    int statusCode = connection.getResponseCode(); // throws IOException 
+0

to jest praca dla mnie http://stackoverflow.com/a/9894629/3758898 –

Odpowiedz

50

Znalazłem przyczynę.

Przede wszystkim dla wszystkich, którzy nie są świadomi tego, co oznacza ten błąd (na pewno nie było): Ten wyjątek jest generowany, jeśli serwer odpowiada za pomocą 401. Bardzo intuicyjny, biorąc pod uwagę, że został zgłoszony getResponseCode() (nigdy nie będziesz w stanie sam sprawdzić 401, ale musisz złapać ten wyjątek IOException ...).

Rzeczywistą przyczyną 401 było to, że nie wysłałem kodu weryfikatora OAuth tam, gdzie było to oczekiwane w tym momencie.

+0

Cześć Matthias, czy używałeś api? – MounirReg

+1

Nie I wpadł na ten problem jako część implementacji DefaultOAuthProvider dla Signpost, który używa HTTPUrlConnection zamiast Apache HttpClient. – Matthias

+0

Czy trzymałeś się drogowskazu? Mam na nim wiele problemów na Androida. –

13

Może być przydatna dla kogoś ...

Wyjątek ten oznacza po prostu zniekształcone nagłówki odpowiedź: „WWW-Authenticate” nagłówek nie został znaleziony. Ponadto, fragmenty odpowiedzi z kodem 401 nie są obsługiwane, więc potrzebujesz nagłówka "Content-Length" (może być zero).

+0

lub nagłówek "Authorization" – Matthias

+4

Klient musi wysłać nagłówek "Authorization", a jeśli serwer nie podoba się poświadczeń, musi odesłać "WWW-Authenticate". W moim przypadku jest to nasz serwer i wysyłał 'WWW-Authenticate' tylko wtedy, gdy brakowało nagłówka' Authorization'. Aby naprawić błąd w temacie, wprowadziliśmy zmianę po stronie serwera, aby wysłać "WWW-Authenticate", gdy autoryzacja się nie powiedzie. – katit

4

Wystarczy dodać ten nagłówek na żądanie (w stronie serwera):

WWW-Authenticate: None 
2

Należy pamiętać, że istnieją dwa sposoby uwierzytelniania: HTTP Authentication i token-based authentication. Jeśli korzystasz z uwierzytelniania HTTP, musisz postępować zgodnie z podaną specyfikacją: w polu nagłówka WWW-Authenticate po stronie serwera, używaj lokalnie java.net.Authenticator itp. Jeśli korzystasz z uwierzytelniania opartego na tokenach, to oczywiście musisz używać plików cookie do przechowywania token i sprawiają, że żyją długo żyjącymi sesjami. W takim przypadku umieścić następny kod do android.app.Application.onCreate()

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

i nie będzie mieć kłopoty podczas odbierania HTTP 401 z serwera WWW bez uwierzytelnienie dziedzinie nagłówka.

Powiązane problemy