`

【Android】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://hi.baidu.com/yan__jh/blog/item/d6a689c17d33502ce4dd3b01.html
分享到:
评论

相关推荐

    okhttp-digest:okhttp的摘要身份验证器

    okhttp-digest okhttp的摘要身份验证器。 大多数代码是从Apache Http Client移植的。重要的该工件已从jcenter转移到了Maven Central! 坐标已从com.burgstaller:okhttp-digest:&lt;version&gt;到io.github.rburgst:okhttp-...

    ajax调用java实例源码-java-curl:纯JavaCURL实现

    java-curl是标准JRE中基于HttpURLConnection实现的纯javaHTTP实用工具,用法参考Linux下常用的CURL命令行工具。 特征 基于标准JRE,源码兼容级别为1.6,可用于Java服务器端、Android等Java环境。 代码超级紧凑(一个...

    java开源包3

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包4

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    java开源包1

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    JAVA上百实例源码以及开源项目源代码

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    java开源包11

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包2

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包6

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包5

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包10

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包8

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包7

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包9

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包101

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    Java资源包01

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

Global site tag (gtag.js) - Google Analytics