网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

访问需要HTTPBasicAuthentication认证的资源的各种语言的实现

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

无聊想调用下嘀咕的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:
    Authorization: "Basic 用户名和密码的base64加密字符串"
  • 二是在url中添加用户名和密码:
    http://userName:password@api.minicloud.com.cn/statuses/friends_timeline.xml

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

先看.NET的吧:

  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的:

  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的:

  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的:

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

还有Ruby On Rails的:

  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的了:

  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是实现不了的。。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师