在Android果冻豆4.1 HTTP基本身份验证问题使用HttpURLConnection的(HT

2019-07-18 19:26发布

我们正在根据HttpURLConnection类要求使用HTTP基本身份验证的Web服务器。 守则适用于Android版本2.x,3.x中,4.0.x的伟大现在有了果冻豆和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

我们使用HttpURLConnection的为Android文档中的验证码:

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

经进一步调查和故障排除,我们发现这个代码不被称为4.1果冻豆!

什么是安卓果冻豆4.1的解决方法或基本身份验证的正确方法?

有人发现,在本相关主题的Android源代码不同,我认为我们有是关系到这种差异的问题: HttpURLConnection的Android中2.x的工作正常但不是在4.1:未找到验证挑战

Answer 1:

我们能够解决果冻豆未通过以下新方法调用认证者的getPasswordAuthentication():

@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);

为Froyo的注释的@TargetApi只是必要的,因为我们的Base64同时在API 8加仍然支持API 7



Answer 2:

对于Android的一个401未授权响应HttpURLConnection的服务器必须发回一个身份验证标头是这样的...
WWW身份验证:虚假境界=“blahblah”,评论=“使用形式登录”
按照
http://tools.ietf.org/html/rfc2616搜索“10.4.2 401未授权”



文章来源: HTTP Basic Authentication issue on Android Jelly Bean 4.1 using HttpURLConnection