IOException: “authentification Reçues défi est nulle” (Apache Harmony/Android)
J'essaie d'envoyer un via Android HttpURLConnection
(importé de org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
), et lors de la réception de la réponse, un IOException est jeté:
dans doRequestInternal(): "d'authentification Reçues défi est null"
Que fait cette erreur signifie, et quelle en est la cause? Je suis en train d'écrire OAuth paramètres de l'en-tête d'Autorisation, mais je le fais sur d'autres occasions, trop, sans problèmes.
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
- c'est un travail pour moi, stackoverflow.com/a/9894629/3758898
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la raison.
Tout d'abord, à tous ceux qui ne sont pas conscient de ce que cette erreur signifie (je n'étais pas):
Cette exception est levée si le serveur répond avec un 401. Très intuitif, considérant qu'il a été jeté dans getResponseCode() (j'.o.w. vous n'êtes jamais en mesure de vérifier pour 401s vous-même, mais pour attraper cette IOException à la place...).
La cause réelle de la 401 est que je n'ai pas envoyer un OAuth vérificateur de code où il a été prévu à ce stade.
Peut-être sera utile pour quelqu'un...
Cette exception signifie simplement mal formé les en-têtes de réponse: le "WWW-Authenticate" en-tête n'a pas été trouvé.
Aussi, fragments de réponses avec 401 du code ne sont pas pris en charge, vous aurez besoin d' "Content-Length" de l'en-tête (peut être zéro).
WWW-Authenticate
. Dans mon cas, c'est notre serveur et il a été l'envoi deWWW-Authenticate
uniquement lorsqueAuthorization
en-tête manquait. Pour corriger l'erreur dans le sujet, nous avons fait un changement sur le côté serveur pour envoyerWWW-Authenticate
lorsque l'Autorisation est refusée.Il suffit d'ajouter cette en-tête de la demande (côté serveur):
Veuillez noter qu'il y a deux authentification approches: L'Authentification HTTP et authentification basée sur les jetons. 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 dansandroid.app.Application.onCreate()
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.