Http Digest 认证在android平台的实现
2015-08-19 16:57
459 查看
课题:
编写一个Android应用,访问一个基于Http服务的数据服务系统,为了提高安全性,该数据服务系统采用了Http Digest认证体系,理由是,相比基本认证方式而言,Digest认证可以保证认证信息(用户名和密码)的传输安全,同时比SSL简单易用。在使用浏览器访问时,会提示一个用户名和密码对话框,但如果是程序访问,就需要在程序访问过程中编程提供认证信息。
要求:
-- 在程序中可以设置用户名和密码-- 可以通过网络访问基于Digest认证和Http数据服务(JSON格式)
-- 使用Android基本库,不使用其他扩展库(基于兼容性考虑)
-- 支持Android2.2以上系统
-- 技术实现简单清晰
实现:
网络上提供的一些解决方案都有一些问题,如需要使用第三方的类库,创建认证器,手工设置请求参数等等,都比较麻烦,而且问题很多,经过摸索,我在程序中实现了基于Android标准库的认证过程,实现思路、过程和示例代码如下:基础逻辑是:
--- 使用HttpClient(DefaultHttpClient)类连接服务器并获取数据
DefualtHttpClient 类:创建client对象
excuete(HttpGet)方法:执行连接和获取,参数是一个HttpGet对象
HttpGet类:基于url创建HttpGet对象
HttpResponse类: execute的返回值
getEntiry().getContent() 方法:获取数据流
--- 该client访问需要认证的资源需要一个认证方法,就需要设置一个认证提供者
client的 setCredentialsProvider(bcp) 方法:设置认证提供者
BasicCredentialsProvider 类:创建认证提供者实例
setCredentials 方法:设置AuthScope和UsernamePasswordCredentials类
AuthScope类:认证范围,基于主机,端口和领域构建
UsernamePasswordCredentials:基于用户名和口令的证书,基于用户名和口令构建
实现代码如下:
// 1. 获取并设置url地址,一个字符串变量,一个URL对象
String urlStr ="http://<host>:<port>/data.json";
URL url= new URL(urlStr);
// 2. 创建一个密码证书,(UsernamePasswordCredentials类)
String username="foo";
String password="bar";
UsernamePasswordCredentials upc = new UsernamePasswordCredentials(username, password);
// 3. 设置认证范围 (AuthScore类)
String strRealm = "<mydomain>";
String strHost = url.getHost();
int iPort = url.getPort();
AuthScope as = new AuthScope(strHost, iPort, strRealm);
// 4. 创建认证提供者(BasicCredentials类) ,基于as和upc
BasicCredentialsProvider bcp=new BasicCredentialsProvider();
bcp.setCredentials(as, upc);
// 5. 创建Http客户端(DefaultHttpClient类)
DefaultHttpClient client=new DefaultHttpClient();
// 6. 为此客户端设置认证提供者
client.setCredentialsProvider(bcp);
// 7. 创建一个get 方法(HttpGet类),基于所访问的url地址
HttpGet hg= new HttpGet(urlStr);
// 8. 执行get方法并返回 response
HttpResponse hr = client.execute(hg);
// 9. 从response中取回数据,使用InputStreamReader读取Response的Entity:
String line=null;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(hr.getEntity().getContent() ));
while((line = reader.readLine()) != null) builder.append(line);
strContent=builder.toString();
总结
--- 对比Java中的实现,可以看到Andriod中的apache.http库和commons-httpclient库有比较大的结构和实现上的差异,这个原因导致了基于Java的实现不能直接移植到Android上。--- 上述的实现简单、逻辑清楚而容易理解,并且不涉及到更复杂的Digest认证的技术细节,而是由CredentialsProvider封装了。
--- 上述实现没有使用通常的connection类,而是client类,提供更丰富的连接和状态控制功能,相比较而言,connection更加简单
--- 用户名和密码作为认证框架中的参数而不是http request的组成部分,更加安全
--- 这里没有讨论服务器端的实现,实际上我是通过Rails来实现http digest的。但理论上这种认证方式是标准。
相关文章推荐
- 【网络流24题之餐巾计划】xoj 1247
- apache的https访问配置
- Haproxy+keepalived TCP 层的负载均衡
- Android,http传送url链接中文乱码
- http_build_query
- Basic and Digest Access Authentication (rfc2617) 及HttpClient实现
- HTTP协议详解
- 确保安全的HTTPS(对HTTP加密的几种技术,前端面试常问)第一篇
- lvs DR模式 +keepalived 实现directory 高可用、httpd服务负载均衡集群
- http post get 区别
- 纯源码编译安装LAMP,linux,httpd,php,mysql源码编译安装
- QNetAccessManager http请求
- .Net程序员安卓学习之路3:Post数据给网络API
- .Net程序员安卓学习之路2:访问网络API
- android http多请求异步封装对你绝对有用
- 浅论Android网络请求库——android-async-http
- Android Http异步请求,Callback
- 手提wifi双卡配置+window7同时多用户远程+有些公司限制网络环境方案
- Tcp重传
- 网络篇-----AFN 03监控网络状态