6

HTTP 基本認証を使用して、Web サーバーに HttpURLConnection ベースの要求を行っています。コードは Android バージョン 2.x、3.x.、4.0.x でうまく動作します。現在、Jelly Bean と v4.1.x では認証が失敗し、LogCat に次のメッセージが表示されます。

01-27 10:54:18.886: ...::doReadRawData(731): An exception occured while reading data from remote host. httpURLConn.responseCode = 401 / httpURLConn.responseMessage = UNAUTHORIZED
01-27 10:54:18.886: ...::doReadRawData(731): java.io.IOException: No authentication challenges found

Android ドキュメントのように HttpURLConnection に使用する認証コード:

private void doAuthorize() {
        Authenticator.setDefault(new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USER, PASSWORD.toCharArray());
            }
        });
    }

さらに調査してトラブルシューティングを行った結果、このコードは 4.1 Jelly Bean では呼び出されていないことがわかりました。

Android Jelly Bean 4.1 での基本認証の回避策または適切な方法は何ですか?

誰かがこの関連トピックの Android ソース コードで異なることを発見しました。私たちが抱えている問題はその違いに関連していると思います:

4

2 に答える 2

5

次の新しいメソッドを使用して、認証システムの getPasswordAuthentication() を呼び出さない Jelly Bean を解決できました。

@TargetApi(Build.VERSION_CODES.FROYO) 
private void setJellyBeanAuth(HttpURLConnection httpConn) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        byte[] auth = (USER + ":" + PASSWORD).getBytes();
        String basic = Base64.encodeToString(auth, Base64.NO_WRAP);
        httpConn.setRequestProperty("Authorization", "Basic " + basic);
    }
}

次に、接続を開いた後にこの関数を呼び出します。

httpURLConn = (HttpURLConnection) url.openConnection();
setJellyBeanAuth(httpURLConn);

API 8 で Base64 が追加されましたが、API 7 を引き続きサポートしているため、Froyo アノテーションの @TargetApi のみが必要です。

于 2013-01-27T19:49:00.100 に答える
3

For a 401 UNAUTHORIZED response with Android's httpURLConnection your server must send back a authenticate header like this...
WWW-Authenticate: Bogus realm="blahblah", comment="use form to log in"
as per
https://www.rfc-editor.org/rfc/rfc2616 search "10.4.2 401 Unauthorized"

于 2013-04-09T04:34:46.237 に答える