Android - Volley-Fehler Keine Authentifizierungs-Probleme gefunden

Ich versuche mit altem Code zu arbeiten und bin auf ein Problem gestoßen, als ich Volley benutzt habe.

Ich versuche, zu einer API zu kommen, die unsere Hauptseite hat, und es funktioniert gut für einen Account, aber nicht für einen anderen. Ich versuche herauszufinden, was die Unterschiede in der Anfrage URL/Header und auch, was kommt in der Antwort zurück, aber ich kann nicht scheinen, einen Weg in den Volley-Code zu finden, um dies in das Protokoll zu drucken.

Der Fehler, den ich bekomme, ist

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

Ich habe gelesen, dass dies auf eine Antwort von 401 zurückzuführen sein könnte, aber ich weiß nicht genau, was das bedeutet oder zumindest, wie ich das beweisen/testen kann. Ich bin wirklich verwirrt, dass es für einen Account funktioniert und nicht für einen anderen.

Die URL ist etwas anders als für unsere UK-Seite und die andere unserer AM, aber ansonsten gibt es keinen Unterschied.

Vielen Dank

0
@ Raghunandan Weißt du, ob es sowieso mehr Infos gibt als das? Irgendwelche Antwortdetails usw.?
hinzugefügt der Autor Russ Wheeler, Quelle
@bbalazs Ich glaube nicht, dass das hilft, das habe ich schon gelesen. Ich denke nicht, dass das Volleyball ist.
hinzugefügt der Autor Russ Wheeler, Quelle
@ Raghunandan, was lässt dich denken, dass keine Verbindung hergestellt werden konnte? Ich dachte, es war, als die Authentifizierung nicht übereinstimmte
hinzugefügt der Autor Russ Wheeler, Quelle
Es ist ein Fehler, der anzeigt, dass keine Verbindung hergestellt werden konnte, wenn eine Volley-Anfrage durchgeführt wurde.
hinzugefügt der Autor Raghunandan, Quelle
Es konnte keine Verbindung hergestellt werden. Wenn keine Verbindung besteht, ist die Chance für eine Antwort gegeben
hinzugefügt der Autor Raghunandan, Quelle
@RussWheeler prüft die Quelle @SuppressWarnings ("serial") öffentliche Klasse NoConnectionError erweitert NetworkError {public NoConnectionError() {super (); } public NoConnectionError (Throwable reason) {super (Grund); }} und es gibt einen Kommentar, der sagt/** * Fehler, der anzeigt, dass keine Verbindung hergestellt werden konnte, wenn eine Volley-Anfrage durchgeführt wurde. * /
hinzugefügt der Autor Raghunandan, Quelle
Es hat nichts mit Netzwerkverbindung zu tun, es gab einen Fehler beim Lesen eines Headers in der Antwort, wenn 401 gegeben wurde. Siehe hier: stackoverflow.com/questions/12931791/…
hinzugefügt der Autor for3st, Quelle

4 Antworten

Tatsächlich habe ich dieses Problem gelöst, indem ich den Header WWW-Authenticate in die Serverantwort eingefügt habe.

Wenn Sie jedoch die Kopfzeile WWW-Authenticate: Basic realm = "" hinzufügen und Ihre API auch von Web-Clients verwendet wird, werden einige Webbrowser ein Pop-up auslösen, in dem nach grundlegenden Anmeldeinformationen gefragt wird.

Für mich ist die richtige Lösung ein benutzerdefiniertes Schema. Wie in diesem Blogpost erläutert, verwende ich xBasic anstelle von Basic in der Headerantwort.

WWW-Authenticate: xBasic realm = ""

Mit diesem Header analysiert nicht nur Volley die Antwort korrekt, sondern ich vermeide auch Web-Browser, die das Authentifizierungs-Popup zeigen.

0
hinzugefügt
Es tut mir leid, dass ich diese Frage schon vor langer Zeit gestellt habe. Ich kann mich nicht einmal mehr daran erinnern, was damit zusammenhängt und dass dieses ältere Projekt heruntergefahren wurde. Ich werde Ihre Antwort für die Mühe, die Sie eingegeben haben, auffrischen, aber ich habe keine Möglichkeit zu überprüfen, ob es richtig ist, also werde ich es nicht als Antwort auswählen, fürchte ich.
hinzugefügt der Autor Russ Wheeler, Quelle
@Russ Kein Problem! Ich wollte nur anderen Menschen helfen, die eine Antwort suchen :)
hinzugefügt der Autor Xavi Gil, Quelle
Nur eine Anmerkung, die das begleitet. Sie können eine beliebige Zeichenfolge für das Schema verwenden (z. B. xBasic wie oben), aber die realm = "" (einschließlich Anführungszeichen) muss ebenfalls enthalten sein, um zu vermeiden, dass die Ausnahme ausgelöst wird .
hinzugefügt der Autor Paul LeBeau, Quelle
wie WWW-Authenticate Header in der Serverantwort hinzugefügt wird
hinzugefügt der Autor sss, Quelle

Dieser Fehler tritt auf, weil der Server 401 (nicht autorisiert) sendet, aber kein "WWW-Authenticate" gibt, was ein Hinweis für den Client ist, was als nächstes zu tun ist. Der Header "WWW-Authenticate" teilt dem Client mit, welche Art von Authentifizierung benötigt wird (entweder Basic oder Digest ). Dies ist normalerweise bei kopflosen HTTP-Clients nicht sehr hilfreich, aber so ist der Standard definiert. Der Fehler tritt auf, weil die Bibliothek versucht, den Header "WWW-Authenticate" zu analysieren, dies jedoch nicht kann.

Mögliche Lösungen, wenn Sie den Server ändern können:

  • Fügen Sie einen gefälschten "WWW-Authenticate" -Header hinzu, wie zum Beispiel: WWW-Authenticate: Basic realm = "fake" . Dies ist eine bloße Problemumgehung, keine Lösung, aber es sollte funktionieren und der HTTP-Client ist zufrieden.
  • Verwenden Sie den HTTP-Statuscode 403 anstelle von 401 . Es ist semantisch ist nicht das gleiche und in der Regel, wenn die Arbeit mit Login 401 ist eine richtige Antwort ( Sehen Sie hier für eine ausführliche Diskussion ), aber es ist nahe genug.

Mögliche Lösungen, wenn Sie den Server nicht ändern können:

As @ErikZ wrote in his post you could use a try&catch

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(); 
}

I also posted this here: java.io.IOException : No authentication challenges found

0
hinzugefügt
Es tut mir leid, dass ich diese Frage schon vor langer Zeit gestellt habe. Ich kann mich nicht einmal mehr daran erinnern, was damit zusammenhängt und dass dieses ältere Projekt heruntergefahren wurde. Ich werde Ihre Antwort für die Mühe, die Sie eingegeben haben, auffrischen, aber ich habe keine Möglichkeit zu überprüfen, ob es richtig ist, also werde ich es nicht als Antwort auswählen, fürchte ich.
hinzugefügt der Autor Russ Wheeler, Quelle
Basic und Digest setzt einfach einen Header, der wie folgt aussieht: "Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" in Basic und komplizierter im Digest - das ist nicht speziell für Volley, sondern nur Set-Header (google wie man das in Volley macht)
hinzugefügt der Autor for3st, Quelle
Meinetwegen. Ich werde es verlassen, da ich eine ganze Weile gebraucht habe, um das Problem zu verstehen - das Lernen der REST/HTTP-Spezifikationen ist manchmal nicht so einfach, wie Sie denken :)
hinzugefügt der Autor for3st, Quelle
Ich versuche, einen Header mit Digest-Authentifizierung zu senden, kann aber nicht herausfinden, wie es geht (immer noch nach einer Antwort suchend). Haben Sie eine Probe, wie Sie eine Digest- (oder sogar Basis-) Authentifizierung in Android-Volley durchführen können?
hinzugefügt der Autor Michel Ayres, Quelle
wie WWW-Authenticate Header in der Serverantwort hinzugefügt wird
hinzugefügt der Autor sss, Quelle

Wenn der Server abgestürzt ist, könnte dieses Problem auftreten. Schritte:

  1. Stop the tomcat server

  2. goto Run -> Services -> restart your database (ex: postgres)

  3. Start the tomcat server.

0
hinzugefügt

Sie können überprüfen, ob es sich um AuthFailureError handelt.

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError));
0
hinzugefügt