2013-12-16 33 views
11

Próbuję pracować z jakimś starszym kodem i mam do czynienia z problemem podczas używania salwy.android - błąd salwy Nie znaleziono żadnych problemów z uwierzytelnianiem

Próbuję dostać się do api, że nasza główna strona ma i działa dobrze dla jednego konta, ale nie innego Próbuję dowiedzieć się, jakie mogą być różnice w adresie URL/nagłówku żądania, a także, co powraca w odpowiedzi, ale nie mogę znaleźć sposobu w kodzie volley, aby wydrukować to do dziennika.

Błąd Dostaję jest

com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found 

Czytałem wokół, że może to być spowodowane odpowiedzi 401, ale ja naprawdę nie wiem, co to znaczy albo przynajmniej jak udowodnić/przetestuj to. Jestem bardzo zdezorientowany, że działa na jednym koncie, a nie na innym.

Adres URL jest nieco inny, ponieważ adres URL jest dla naszej witryny w Wielkiej Brytanii, a drugi dla naszej strony AM, ale poza tym nie ma różnicy.

Dzięki

+0

Jest to błąd wskazujący, że nie można ustanowić żadnego połączenia podczas wykonywania polecenia Volley. – Raghunandan

+0

@Raghunandan czy wiesz, czy jest jeszcze więcej informacji? Jakieś szczegóły odpowiedzi itp.? –

+0

nie można nawiązać połączenia. jeśli nie ma połączenia, gdzie jest szansa na uzyskanie odpowiedzi – Raghunandan

Odpowiedz

8

Ten błąd zdarza się, ponieważ serwer wysyła 401 (Nieautoryzowane), ale nie dać „uwierzytelniania w sieci WWW”, która jest wskazówką dla klienta, co robić dalej. Nagłówek "WWW-Authenticate" informuje klienta, jakiego rodzaju uwierzytelnienie jest potrzebne (Basic lub Digest). Zwykle nie jest to przydatne w przypadku bezgłowych klientów http, ale tak definiuje się standard. Błąd występuje, ponieważ lib próbuje przeanalizować nagłówek "WWW-Authenticate", ale nie może.

Możliwe rozwiązania, czy można zmienić serwer:

  • Dodaj fałszywy „www uwierzytelnienie” nagłówek jak: WWW-Authenticate: Basic realm="fake". Jest to zwykłe obejście, a nie rozwiązanie, ale powinno działać, a klient HTTP jest zadowolony.
  • Użyj kodu stanu HTTP 403 zamiast 401. To semantyczne nie jest takie samo i zwykle podczas pracy z loginem 401 jest poprawna odpowiedź (see here for a detailed discussion), ale jest wystarczająco blisko.

Możliwe rozwiązania, jeśli nie można zmienić serwer:

Jak @ErikZ napisał w swoim post można użyć spróbować & połowów przy

HttpURLConnection connection = ...; 
try { 
    // Will throw IOException if server responds with 401. 
    connection.getResponseCode(); 
} catch (IOException e) { 
    // Will return 401, because now connection has the correct internal state. 
    int responsecode = connection.getResponseCode(); 
} 

Zamieściłem to też tutaj: java.io.IOException : No authentication challenges found

+0

Próbuję wysłać nagłówek z Sprawdzanie autentyczności, ale nie może dowiedzieć się, jak to zrobić (wciąż szuka odpowiedzi). Czy masz przykład, jak wykonać uwierzytelnianie Digest (lub nawet podstawowe) w systemie Android-Volley? –

+0

Basic i Digest to po prostu nagłówek, który wygląda jak "Autoryzacja: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" w Basicu i bardziej skomplikowanym podsumowanie - to nie jest specjalne dla volley, po prostu umieszczasz set headers (google, jak to zrobić w siatkówce) – for3st

+0

Przykro mi, że zadałem to pytanie tak dawno temu, że nawet nie pamiętam, do czego to służy, a także, że ten staroświecki projekt został zamknięty. Przekażę twoją odpowiedź za wysiłek, jaki włożyłeś, ale nie masz możliwości sprawdzenia, czy to prawda, więc nie wybiorę go jako odpowiedzi, której się boję. –

8

Rzeczywiście, rozwiązałem ten problem, dodając nagłówek WWW-Authenticate do odpowiedzi serwera.

Jeśli jednak dodasz nagłówek WWW-Authenticate: Basic realm="", a Twój interfejs API zostanie również wykorzystany przez klientów sieciowych, niektóre przeglądarki internetowe będą wyświetlać wyskakujące okienko z pytaniem o podstawowe poświadczenia.

Dla mnie właściwe rozwiązanie korzysta z niestandardowego schematu. Jak wyjaśniono w tej publikacji: blog post, używam xBasic zamiast Basic w odpowiedzi nagłówka.

WWW-Authenticate: xBasic realm=""

Z tego nagłówka nie tylko Volley analizuje odpowiedzi poprawnie, ale również uniknąć przeglądarek internetowych pokazujące uwierzytelniania pop-up.

+0

Przepraszam, I zadałem to pytanie tak dawno temu, że nawet nie pamiętam, do czego to służy, a także, że ten staroświecki projekt został zamknięty. Przekażę twoją odpowiedź za wysiłek, jaki włożyłeś, ale nie masz możliwości sprawdzenia, czy to prawda, więc nie wybiorę go jako odpowiedzi, której się boję. –

+0

@Russ Bez problemu! Po prostu chciałem pomóc innym osobom, które szukają odpowiedzi :) –

+0

Wystarczy notatka, aby im towarzyszyć. Możesz użyć dowolnego ciągu znaków dla schematu (np. '' XBasic' jak wyżej), ale 'realm =" "(włącznie z cudzysłowami) musi również zostać uwzględniony, aby uniknąć zgłaszania wyjątku. –

0

udało mi się złapać tego po stronie klienta podczas inicjalizacji RequestQueue volley:

Volley.newRequestQueue(getApplicationContext(), new HurlStack() { 
     @Override 
     public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) { 
      try { 
       return super.performRequest(request, additionalHeaders); 
      } catch (AuthFailureError authFailureError) { 
       authFailureError.printStackTrace(); 
       // Log out/whatever you need to do here 
      } catch (IOException e) { 
       e.printStackTrace(); 
       if (e.getMessage().equals("No authentication challenges found")) { 
        // This is the error. You probably will want to handle any IOException, not just those with the same message. 
       } 
      } 
      return null; 
     } 
}); 
0

Jeśli serwer pada, może napotkać na ten problem. Kroki:

  1. zatrzymać serwer Tomcat

  2. goto Uruchom -> Usługi -> zrestartuj bazę danych (np postgres'owy)

  3. uruchomić serwer Tomcat.

0

Możesz sprawdzić e jest instanceof AuthFailureError.

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError)); 
Powiązane problemy