如何在Android中进行HTTP身份验证?


73

我正在检查org.apache.http.auth类。还有其他参考或示例吗?


2
这是关于Android应用程序身份验证的问题,还是关于仅在Android上运行的常规Web应用程序的身份验证的问题?
jottos

对于Web身份验证(http身份验证)和用户凭据(用户名,密码)
Bohemian

Answers:


79

我之前没有见过那个特定的程序包,但是它说它是用于客户端HTTP身份验证的,我已经可以使用java.netAPI在Android上完成此操作,如下所示:

Authenticator.setDefault(new Authenticator(){
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("myuser","mypass".toCharArray());
    }});
HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection();
c.setUseCaches(false);
c.connect();

显然,您的getPasswordAuthentication()应该比返回常量更智能。

如果您尝试POST通过身份验证的正文(例如)发出请求,请注意Android问题4326。我已经将建议的修复程序链接到那里的平台,但是如果您只想要基本身份验证,则有一个简单的解决方法:不要打扰Authenticator,而是这样做:

c.setRequestProperty("Authorization", "basic " +
        Base64.encode("myuser:mypass".getBytes(), Base64.NO_WRAP));

您是否知道android 2.0中存在任何base64编码类?
Bohemian

该平台在几个地方都有它,但奇怪的是他们没有公开它。他们甚至在的文档中保留了对它的引用android.utilksoap2-android当我找到它时,我正在使用它们,并且它们的实现仅取决于java.io,因此您可以从以下目录中
克里斯·博伊尔

3
如果由于提供的凭据不正确而导致身份验证失败,您该如何处理?
SK9

1
Base64在较旧的Android版本中不可用。有什么建议吗?
amit

尝试c.connect()时出现错误;,它说IOException
Bachask8

116

对我来说,它奏效了

final String basicAuth = "Basic " + Base64.encodeToString("user:password".getBytes(), Base64.NO_WRAP);

Apache HttpCLient:

request.setHeader("Authorization", basicAuth);

HttpUrlConnection:

connection.setRequestProperty ("Authorization", basicAuth);

23
NO_WRAP标志!那是关键。我只是使用默认的,不知道为什么我一直得到一个400
罗伯特Massaioli

5
您的回答为我节省了很多时间。谢谢!我的问题确实是错误的标志(默认)。
约翰尼·杜

5
终于,经过很长一段时间... no_wrap FTW!
Thiago Festa 2013年

谢谢哥们,这是核心:)
约翰·克里斯蒂

1
感谢您简洁的回答!Android社区FTW。
LukeWaggoner 2014年


13

手动方法可以很好地与import android.util.Base64配合使用,但是请务必在调用encoding时设置Base64.NO_WRAP:

String basicAuth = "Basic " + new String(Base64.encode("user:pass".getBytes(),Base64.NO_WRAP ));
connection.setRequestProperty ("Authorization", basicAuth);


1

这对我有用

 URL imageUrl = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) imageUrl
                            .openConnection();
                    conn.setRequestProperty("Authorization", "basic " +
                            Base64.encode("username:password".getBytes()));
                    conn.setConnectTimeout(30000);
                    conn.setReadTimeout(30000);
                    conn.setInstanceFollowRedirects(true);
                    InputStream is = conn.getInputStream();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.