访问需要HTTP Basic Authentication认证的资源的各种语言的实现

时间:2022-07-21 16:24:45

无聊想调用下嘀咕的api的时候,发现需要HTTP Basic Authentication,就看了下。

什么是HTTP Basic Authentication?直接看http://en.wikipedia.org/wiki/Basic_authentication_scheme 吧。

在你访问一个需要HTTP Basic Authentication的URL的时候,如果你没有提供用户名和密码,服务器就会返回401,如果你直接在浏览器中打开,浏览器会提示你输入用户名 和密码(google浏览器不会,bug?)。你可以尝试点击这个url看看效果:http://api.minicloud.com.cn/statuses/friends_timeline.xml

要在发送请求的时候添加HTTP Basic Authentication认证信息到请求中,有两种方法:

下面来看下对于第一种在请求中添加Authorization头部的各种语言的实现代码。

先看.NET的吧:

Java代码  访问需要HTTP Basic Authentication认证的资源的各种语言的实现
  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.   
  10. WebResponse wr = myReq.GetResponse();  
  11. Stream receiveStream = wr.GetResponseStream();  
  12. StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);  
  13. string content = reader.ReadToEnd();  

你当然也可以使用HttpWebRequest或者其他的类来发送请求。

然后是Python的:

Java代码  访问需要HTTP Basic Authentication认证的资源的各种语言的实现
  1. import urllib2  
  2. import sys  
  3. import re  
  4. import base64  
  5. from urlparse import urlparse   
  6.   
  7. theurl = 'http://api.minicloud.com.cn/statuses/friends_timeline.xml'   
  8.   
  9. username = 'qleelulu'  
  10. password = 'XXXXXX'  # 你信这是密码吗?   
  11.   
  12. base64string = base64.encodestring(  
  13.                 '%s:%s' % (username, password))[:-1] #注意哦,这里最后会自动添加一个\n  
  14. authheader =  "Basic %s" % base64string  
  15. req.add_header("Authorization", authheader)  
  16. try:  
  17.     handle = urllib2.urlopen(req)  
  18. except IOError, e:  
  19.     # here we shouldn't fail if the username/password is right  
  20.     print "It looks like the username or password is wrong."  
  21.     sys.exit(1)  
  22. thepage = handle.read()  

 再来是PHP的:

Java代码  访问需要HTTP Basic Authentication认证的资源的各种语言的实现
  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代码  访问需要HTTP Basic Authentication认证的资源的各种语言的实现
  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.   
  7. private var result:XML;  
  8. private function initApp():void  
  9. {  
  10.     var base64enc:Base64Encoder = new Base64Encoder;  
  11.     base64enc.encode("user:password"); //用户名和密码需要Base64编码  
  12.     var user:String = base64enc.toString();   
  13.   
  14.     var http:HTTPService = new HTTPService;  
  15.     http.addEventListener(ResultEvent.RESULT,resultHandler);//监听返回事件  
  16.     http.addEventListener(FaultEvent.FAULT,faultHandler);     //监听失败事件  
  17.     http.resultFormat = "e4x";//返回格式  
  18.     http.url = "http://api.digu.com/statuses/friends_timeline.xml"; 以嘀咕网的API为列  
  19.     http.headers = {"Authorization":"Basic " + user};  
  20.     http.send();  
  21. }  
  22. private function resultHandler(e:ResultEvent):void  
  23. {  
  24.     result = XML(e.result);  
  25.     test.dataProvider = result.status;//绑定数据  
  26. }  
  27. private function faultHandler(e:ResultEvent):void  
  28. {  
  29.     //处理失败  
  30. }  

 还有Ruby On Rails的:

Java代码  访问需要HTTP Basic Authentication认证的资源的各种语言的实现
  1. class DocumentsController < ActionController  
  2.   before_filter :verify_access   
  3.   
  4.   def show  
  5.     @document = @user.documents.find(params[:id])  
  6.   end   
  7.   
  8.   # Use basic authentication in my realm to get a user object.  
  9.   # Since this is a security filter - return false if the user is not  
  10.   # authenticated.  
  11.   def verify_access  
  12.     authenticate_or_request_with_http_basic("Documents Realm"do |username, password|  
  13.       @user = User.authenticate(username, password)  
  14.     end  
  15.   end  
  16. end  

 JavaScript的:

Java代码  访问需要HTTP Basic Authentication认证的资源的各种语言的实现
  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.   
  8. var auth = make_basic_auth('QLeelulu','mypassword');  
  9. var url = 'http://example.com';   
  10.   
  11. // 原始JavaScript  
  12. xml = new XMLHttpRequest();  
  13. xml.setRequestHeader('Authorization', auth);  
  14. xml.open('GET',url)   
  15.   
  16. // ExtJS  
  17. Ext.Ajax.request({  
  18.     url : url,  
  19.     method : 'GET',  
  20.     headers : { Authorization : auth }  
  21. });   
  22.   
  23. // jQuery  
  24. $.ajax({  
  25.     url : url,  
  26.     method : 'GET',  
  27.     beforeSend : function(req) {  
  28.         req.setRequestHeader('Authorization', auth);  
  29.     }  
  30. });  

 这里提醒下,HTTP Basic Authentication对于跨域又要发送post请求的用JavaScript是实现不了的(注:对于Chrome插件这类允许通过AJAX访问跨域资源的,是可以的)。

 

来源:http://www.cnblogs.com/QLeelulu/archive/2009/11/22/1607898.html