Http Digest 认证在android平台的实现

课题:

编写一个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的。但理论上这种认证方式是标准。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/

时间: 2024-11-02 05:09:07

Http Digest 认证在android平台的实现的相关文章

Android平台GPS系统的应用开发

第一部分.前述: Android作为Google移动互联网战略的重要组成部分,将进一步推进"随时随地为每个人提供信息"这一企业目标的实现.Google的目标是让移动通信不依赖于设备,甚至是平台.出于这个目的,Android将完善而不是替代Google长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品. 随着城市化的进展和家用轿车的普及.原本根遥远的全球卫星定位系统(Global Position System.

微软证实Office软件将登陆iOS和Android平台

对于既想利用Office帮助Windows Phone"鹤立鸡群",又想确保Office"无处不在"的微软而言,这是一个棘手的平衡问题. 北京时间10月11日消息,据国外媒体报道,尽管部分否认了捷克分部发表的一份声明,但微软证实Office软件将以某种方式登陆iOS和Android平台. 微软捷克分部在声明中称,Office将于明年初登陆iOS和Android平台. 微软的表态则不太明确,"我们之前就曾公布过,Office Mobile将支持Windows

.net-用.Net语言如何开发Android平台的App?

问题描述 用.Net语言如何开发Android平台的App? 用Microsoft Visual Studio .Net语言如何开发Android平台的App? 解决方案 评论中那个是一个,这个也是,不过需要你自己慢慢看了,因为是英文的.http://www.codeproject.com/Articles/195450/Developing-Android-Applications-in-NET

Freeline - Android平台上的秒级编译方案

Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部开源,稳定性方面:完善的基线对齐,进程级别异常隔离机制.性能方面:内部采用了类似Facebook的开源工具buck的多工程多任务并发思想:端口扫描,代码扫描,并发编译,并发dx,并发merge dex等策略,在多核机器上有明显加速效果,另外在class及dex,resources层面作了相应缓存策略

Android平台的发展

Android平台的发展       随着经济水平的发展以及科技进步,我们的3g逐步推进,智能手机的价格逐渐被普通民众所接受,这一切利好因素都使得Android平台在现在得到了日新月异的发展,它在方便我们生活的实际过程中起到了切实的作用.       Android平台之所以得到如此巨大的发展,在一定程度上取决于它的开放和免费,使得设备厂商以及软件开发厂商的开发研制成本降低,同时由于其开源性,使它能够满足用户的个性化需求,实现个性化定制,真正做到没有两个完全相同的手机,使其真正成为其独享品,满足

Android平台Outlook.com应用的跨越式重大更新

尽管在去年12月的时候微软在Android平台上也推出了Outlook.com客户端,但是上架之后并未收到消费者的好评,归结原因主要是应用显示有点过时,只是实现了基本的邮件功能.不过这一窘境将会得到改善,微软在官方博客中写道:"今天我怀着非常激动的心情宣布Android平台上的Outlook.com应用得到了一个跨越式的重大更新,对整个界面进行大幅调整之外还融入了大量的功能." 微软在博客中称目前Android平台的Outlook.com应用还需要一些后期的小幅改善,将会马上和用户见面

Android平台Outlook应用增强了收件箱功能

微软已经对Android平台上的Outlook应用进行了升级,除了修复消费者反馈的大量BUG之外还对收件箱的功能进行了强化,为消费者提供未读和已标记信息的筛选功能,此外还能追踪邮件,将其标记成为垃圾邮件.在去年12月份微软在Android平台上发布Outlook应用以来,基本上用户界面和功能都停留在老的Android系统界面上,显然微软也意识到这方面的问题,所以自上个月开始就频繁的更新应用. 下载链接: Outlook for Android app 查看本栏目更多精彩内容:http://www

Android平台HttpClient的使用-手机号码归属地查询

Android平台主要提供了四种数据存储方式:Shared Preferences.文件存储.Sqlite存储和网络存储.其 中: 1)Shared Preferences 一个轻量级的键-值存储机制,专门用于存储键-值对数据,并且仅可以存储基本 的数据类型(boolean.int.long.float和String):通常使用它来存储应用程序的配置信息. 2)文件存储 通过FileInputStream和FileOutputStream对文件进行操作,在Android中,文件是一个应用 程序私

快速解决Android平台移植ffmpeg的一些问题_Android

IT行业是一个踩在巨人肩膀上前进的行业,否则做的事情不一定有意义,所以我也是基于havlenapetr移植的ffmpeg基础上做了些改进,他做的主要贡献有: 1. 移植了ffmpeg并将与媒体相关的结构体在java层重新进行了封装,方便应用程序在java层直接操作ffmpeg API,如各种媒体格式转码及播放,如图1所示 2. 模仿Android的MediaPlayer类实现了ffmpeg的播放接口,如setDataSource(),setDisplay(),start(), stop(),pa