如何在安卓设备上进行HTTP身份验证?

73

我正在查看 org.apache.http.auth 这个类。如果有更多的参考或示例,请提供。


2
这是关于 Android 应用程序身份验证的问题还是关于一般 Web 应用程序的身份验证,只是可能在 Android 上运行? - jottos
针对用户凭据(用户名、密码)的Web身份验证(HTTP身份验证)。 - Bohemian
6个回答

120

对我来说,它起作用了,

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

Apache HttpClient:

request.setHeader("Authorization", basicAuth);

HttpUrlConnection:

connection.setRequestProperty ("Authorization", basicAuth);

24
不换行标志(NO_WRAP flag)!那很关键。我之前一直使用默认设置,不断收到400错误,而不知道原因。 - Robert Massaioli
5
你的回答节省了我很多时间,谢谢!我的问题实际上是由于错误的标记(DEFAULT)引起的。 - Johnny Doe
6
终于,在漫长的时间之后……不换行胜利! - Thiago Festa
哇 - 这个 NO_WRAP 刚刚结束了我对一个没有日志记录的服务器进行 5 小时问题解决的挑战... 谢谢! - slott
1
感谢您提供简洁明了的答案!Android社区万岁。 - LukeWaggoner
显示剩余4条评论

80

我之前没有遇到过那个特定的包,但是它说它是用于客户端HTTP身份验证的,我已经能够在Android上使用java.net API进行身份验证,就像这样:

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
3
如果认证失败,比如提供的凭据有误,你该如何处理这个事件? - Ken
1
Base64在旧版Android中不可用。有什么建议吗? - amit
我在尝试 c.connect() 时遇到了错误,它显示 IOException。 - Bachask8
@Bachask8 IOException 可能与身份验证无关;如果身份验证失败,我会期望收到 401 未经授权的响应。 - Chris Boyle
显示剩余4条评论

14

您可以手动插入HTTP头以发出请求:

HttpGet request = new HttpGet(...);
request.setHeader("Authorization", "Basic "+Base64.encodeBytes("login:password".getBytes()));

13

手动方法在使用import android.util.Base64时工作良好,但在调用encode时务必设置Base64.NO_WRAP:

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

3

对于我的Android项目,我使用了这里的Base64库:

http://iharder.net/base64

这是一个非常全面的库,到目前为止我没有遇到任何问题。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接