web-dev-qa-db-ja.com

IOException:「受信した認証チャレンジはnullです」(ApacheHarmony / Android)

Android経由でGETを送信しようとしていますHttpURLConnection(インポート元org.Apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection)、応答を受信すると、IOExceptionがスローされます。

doRequestInternal()の場合:「受信した認証チャレンジはnullです」

このエラーはどういう意味ですか、そしてこれを引き起こしているのは何ですか?私はOAuthパラメーターをAuthorizationヘッダーに書き込んでいますが、他の場合にも問題なくこれを行っています。

    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
35
Matthias

その理由がわかりました。

まず第一に、このエラーが何を意味するのかを知らないすべての人に(私は確かにそうではありませんでした):サーバーが401で応答した場合、この例外がスローされます。getResponseCode()でスローされたことを考えると、非常に直感的です(iow自分で401をチェックすることはできませんが、代わりにこのIOExceptionをキャッチする必要があります...)。

401の実際の原因は、この時点で予期されていた場所にOAuth検証コードを送信しなかったことです。

50
Matthias

多分誰かのために役立つでしょう...

この例外は、不正な形式の回答ヘッダーを意味します。「WWW-Authenticate」ヘッダーが見つかりませんでした。また、401コードのチャンク回答はサポートされていないため、「Content-Length」ヘッダーが必要になります(ゼロにすることができます)。

13
Vladimir

このヘッダーをリクエストに追加するだけです(サーバー側):

WWW-Authenticate: None
4
Corbella

HTTP認証トークンベースの認証 の2つの認証アプローチがあることに注意してください。 HTTP認証を使用している場合は、参照されている仕様に従う必要があります。サーバー側でWWW-Authenticateヘッダーフィールドを含め、ローカルで_Java.net.Authenticator_を使用します。など。トークンベースの認証を使用している場合は、明らかにCookieを使用してトークンを保存し、長期間有効なセッションを維持できるようにする必要があります。そのような場合は、次のコードをAndroid.app.Application.onCreate()に入れてください

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

また、WWW-AuthenticateヘッダーフィールドがないサーバーからHTTP401を受信するときに問題が発生することはありません。

2
Grigori A.