1. 程式人生 > >訪問需要HTTP Basic Authentication認證的資源的各種語言的實現

訪問需要HTTP Basic Authentication認證的資源的各種語言的實現

無聊想呼叫下嘀咕的api的時候,發現需要HTTP Basic Authentication,就看了下。

在你訪問一個需要HTTP Basic Authentication的URL的時候,如果你沒有提供使用者名稱和密碼,伺服器就會返回401,如果你直接在瀏覽器中開啟,瀏覽器會提示你輸入使用者名稱 和密碼(google瀏覽器不會,bug?)。你可以嘗試點選這個url看看效果:http://api.minicloud.com.cn/statuses/friends_timeline.xml

要在傳送請求的時候新增HTTP Basic Authentication認證資訊到請求中,有兩種方法:

下面來看下對於第一種在請求中新增Authorization頭部的各種語言的實現程式碼。

先看.NET的吧:

Java程式碼  收藏程式碼
  1. string username="username";  
  2. string password="password";  
  3. //注意這裡的格式哦,為 "username:password"  
  4. string usernamePassword = username + ":" + password;  
  5. CredentialCache mycache = new CredentialCache();  
  6. mycache.Add(new Uri(url), "Basic"new NetworkCredential(username, password));  
  7. myReq.Credentials = mycache;  
  8. myReq.Headers.Add("Authorization""Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));   
  9. WebResponse wr = myReq.GetResponse();  
  10. Stream receiveStream = wr.GetResponseStream();  
  11. StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);  
  12. string content = reader.ReadToEnd();  

你當然也可以使用HttpWebRequest或者其他的類來發送請求。

然後是Python的:

Java程式碼  收藏程式碼
  1. import urllib2  
  2. import sys  
  3. import re  
  4. import base64  
  5. from urlparse import urlparse   
  6. theurl = 'http://api.minicloud.com.cn/statuses/friends_timeline.xml'   
  7. username = 'qleelulu'  
  8. password = 'XXXXXX'  # 你信這是密碼嗎?   
  9. base64string = base64.encodestring(  
  10.                 '%s:%s' % (username, password))[:-1] #注意哦,這裡最後會自動新增一個\n  
  11. authheader =  "Basic %s" % base64string  
  12. req.add_header("Authorization", authheader)  
  13. try:  
  14.     handle = urllib2.urlopen(req)  
  15. except IOError, e:  
  16.     # here we shouldn't fail if the username/password is right  
  17.     print "It looks like the username or password is wrong."  
  18.     sys.exit(1)  
  19. thepage = handle.read()  

 再來是PHP的:

Java程式碼  收藏程式碼
  1. <?php  
  2. $fp = fsockopen("www.mydomain.com",80);  
  3. fputs($fp,"GET /downloads HTTP/1.0");  
  4. fputs($fp,"Host: www.mydomain.com");  
  5. fputs($fp,"Authorization: Basic " . base64_encode("user:pass") . "");  
  6. fpassthru($fp);  
  7. ?>  

 還有flash的AS3的:

Java程式碼  收藏程式碼
  1. import mx.rpc.events.FaultEvent;  
  2. import mx.rpc.events.ResultEvent;  
  3. import mx.utils.Base64Encoder;  
  4. import mx.rpc.http.HTTPService;  
  5. URLRequestDefaults.authenticate = false;//設預設為false,否則使用者較驗錯誤時會彈出驗證框   
  6. private var result:XML;  
  7. private function initApp():void  
  8. {  
  9.     var base64enc:Base64Encoder = new Base64Encoder;  
  10.     base64enc.encode("user:password"); //使用者名稱和密碼需要Base64編碼  
  11.     var user:String = base64enc.toString();   
  12.     var http:HTTPService = new HTTPService;  
  13.     http.addEventListener(ResultEvent.RESULT,resultHandler);//監聽返回事件  
  14.     http.addEventListener(FaultEvent.FAULT,faultHandler);     //監聽失敗事件  
  15.     http.resultFormat = "e4x";//返回格式  
  16.     http.url = "http://api.digu.com/statuses/friends_timeline.xml"; 以嘀咕網的API為列  
  17.     http.headers = {"Authorization":"Basic " + user};  
  18.     http.send();  
  19. }  
  20. private function resultHandler(e:ResultEvent):void  
  21. {  
  22.     result = XML(e.result);  
  23.     test.dataProvider = result.status;//繫結資料  
  24. }  
  25. private function faultHandler(e:ResultEvent):void  
  26. {  
  27.     //處理失敗  
  28. }  

 還有Ruby On Rails的:

Java程式碼  收藏程式碼
  1. class DocumentsController < ActionController  
  2.   before_filter :verify_access   
  3.   def show  
  4.     @document = @user.documents.find(params[:id])  
  5.   end   
  6.   # Use basic authentication in my realm to get a user object.  
  7.   # Since this is a security filter - return false if the user is not  
  8.   # authenticated.  
  9.   def verify_access  
  10.     authenticate_or_request_with_http_basic("Documents Realm"do |username, password|  
  11.       @user = User.authenticate(username, password)  
  12.     end  
  13.   end  
  14. end  

 JavaScript的:

Java程式碼  收藏程式碼
  1. //需要Base64見:http://www.webtoolkit.info/javascript-base64.html  
  2. function make_base_auth(user, password) {  
  3.   var tok = user + ':' + pass;  
  4.   var hash = Base64.encode(tok);  
  5.   return "Basic " + hash;  
  6. }   
  7. var auth = make_basic_auth('QLeelulu','mypassword');  
  8. var url = 'http://example.com';   
  9. // 原始JavaScript  
  10. xml = new XMLHttpRequest();  
  11. xml.setRequestHeader('Authorization', auth);  
  12. xml.open('GET',url)   
  13. // ExtJS  
  14. Ext.Ajax.request({  
  15.     url : url,  
  16.     method : 'GET',  
  17.     headers : { Authorization : auth }  
  18. });   
  19. // jQuery  
  20. $.ajax({  
  21.     url : url,  
  22.     method : 'GET',  
  23.     beforeSend : function(req) {  
  24.         req.setRequestHeader('Authorization', auth);  
  25.     }  
  26. });  

 這裡提醒下,HTTP Basic Authentication對於跨域又要傳送post請求的用JavaScript是實現不了的(注:對於Chrome外掛這類允許通過AJAX訪問跨域資源的,是可以的)。