Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Http Digest 認證在android平台的實現

Http Digest 認證在android平台的實現

編輯: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.cn/OS/extra/

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved