35 votes

IOException: "Le défi d'authentification reçu est nul" (Apache Harmony/Android)

J'essaie d'envoyer un GET via HttpURLConnection d'Android (qui est un org.apache.harmony.luni.internal.net.www.protocol.http.http.HttpURLConnection), et à la réception de la réponse, une ioException est jeté:

dans doRequestInternal(): "Le défi d'authentification reçu est nul"

Qu'est-ce que cette erreur signifie, et qu'est-ce qui cause cela? J'écris les paramètres OAuth à l'en-tête d'autorisation, mais je le fais à d'autres occasions, aussi, sans problèmes.

50voto

Matthias Points 17181

J'ai découvert la raison.

Tout d'abord, à tous ceux qui ne sont pas conscients de ce que cette erreur signifie (je n'étais pas sûr): Cette exception est levée si le serveur répond avec un 401. Très intuitif, étant donné qu'il a été jeté dans getResponseCode() (i.o.w. vous n'êtes jamais en mesure de vérifier pour 401s vous-même, mais doivent attraper cette IOException à la place ...).

La cause réelle de la 401 était que je n'ai pas envoyé un code de vérification OAuth où il était prévu à ce stade.

13voto

Vladimir Points 1123

Peut-être sera utile pour quelqu'un ...

Cette exception signifie simplement des en-têtes de réponse mal formés : l'en-tête « WWW-Authenticate » n'a pas été trouvé. En outre, les réponses en morceaux avec le code 401 ne sont pas prises en charge, de sorte que vous aurez besoin de "Content-Length" en-tête (peut être zéro).

4voto

Corbella Points 558

Il suffit d'ajouter cet en-tête à la demande (côté serveur):

2voto

Grigori A. Points 705

Veuillez noter qu'il y a deux authentification approches: l'Authentification HTTP et base de jeton d'authentification. Si vous utilisez l'Authentification HTTP, alors vous devez suivre la norme citée en référence: inclure WWW-Authenticate champ d'en-tête sur le côté serveur, utilisez java.net.Authenticator localement, etc. Si vous utilisez l'authentification basée sur les jetons alors évidemment, vous devez utiliser des cookies pour stocker le jeton et le rendre capable de garder longtemps vécu des séances de vivant. Dans de tels cas, mettez le code suivant dans android.app.Application.onCreate()

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

et vous n'aurez pas de problèmes lors de la réception de HTTP 401 à partir du serveur sans WWW-Authenticate champ d'en-tête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X