打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
http://www.cnblogs.com/QLeelulu/archive/2009/...

客户端的使用

客户端如果要跟“使用基本认证的网站”交互。 非常很简单,把用户名密码 加在Authorization header中就可以了。
 
C#
string url = "https://testsite";HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);NetworkCredential nc = new NetworkCredential("username", "password");req.Credentials = nc;

 

Linux下的curl

curl -u username:password https://testsite/

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

无聊想调用下嘀咕的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的吧:

string username="username";
string password="password";
//注意这里的格式哦,为 "username:password"
string usernamePassword = username + ":" + password;
CredentialCache mycache 
= new CredentialCache();
mycache.Add(
new Uri(url), "Basic"new NetworkCredential(username, password));
myReq.Credentials 
= mycache;
myReq.Headers.Add(
"Authorization""Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); 

WebResponse wr 
= myReq.GetResponse();
Stream receiveStream 
= wr.GetResponseStream();
StreamReader reader 
= new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd(); 

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

然后是Python的:

import urllib2
import sys
import re
import base64
from urlparse import urlparse 

theurl 
= 'http://api.minicloud.com.cn/statuses/friends_timeline.xml' 

username 
= 'qleelulu'
password 
= 'XXXXXX'  # 你信这是密码吗? 

base64string 
= base64.encodestring(
                
'%s:%s' % (username, password))[:-1#注意哦,这里最后会自动添加一个\n
authheader =  "Basic %s" % base64string
req.add_header(
"Authorization", authheader)
try:
    handle 
= urllib2.urlopen(req)
except IOError, e:
    
# here we shouldn't fail if the username/password is right
    print "It looks like the username or password is wrong."
    sys.exit(
1)
thepage 
= handle.read() 

 

再来是PHP的:

<?php
$fp = fsockopen("www.mydomain.com",80);
fputs($fp,"GET /downloads HTTP/1.0");
fputs($fp,"Host: www.mydomain.com");
fputs($fp,"Authorization: Basic " . base64_encode("user:pass". "");
fpassthru($fp);
?> 

 

还有flash的AS3的:

import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.utils.Base64Encoder;
import mx.rpc.http.HTTPService;
URLRequestDefaults.authenticate 
= false;//设默认为false,否则用户较验错误时会弹出验证框 

private var result:XML;
private function initApp():void
{
    var base64enc:Base64Encoder 
= new Base64Encoder;
    base64enc.encode(
"user:password"); //用户名和密码需要Base64编码
    var user:String = base64enc.toString(); 

    var http:HTTPService 
= new HTTPService;
    http.addEventListener(ResultEvent.RESULT,resultHandler);
//监听返回事件
    http.addEventListener(FaultEvent.FAULT,faultHandler);     //监听失败事件
    http.resultFormat = "e4x";//返回格式
    http.url = "http://api.digu.com/statuses/friends_timeline.xml"; 以嘀咕网的API为列
    http.headers 
= {"Authorization":"Basic " + user};
    http.send();
}
private function resultHandler(e:ResultEvent):void
{
    result 
= XML(e.result);
    test.dataProvider 
= result.status;//绑定数据
}
private function faultHandler(e:ResultEvent):void
{
    
//处理失败

 

还有Ruby On Rails的:

class DocumentsController < ActionController
  before_filter :verify_access 

  def show
    @document 
= @user.documents.find(params[:id])
  
end 

  # Use basic authentication 
in my realm to get a user object.
  # Since this 
is a security filter - return false if the user is not
  # authenticated.
  def verify_access
    authenticate_or_request_with_http_basic(
"Documents Realm"do |username, password|
      @user 
= User.authenticate(username, password)
    
end
  
end
end 

 

汗,忘记JavaScript的了:

//需要Base64见:http://www.webtoolkit.info/javascript-base64.html
function make_base_auth(user, password) {
  
var tok = user + ':' + pass;
  
var hash = Base64.encode(tok);
  
return "Basic " + hash;


var auth = make_basic_auth('QLeelulu','mypassword');
var url = 'http://example.com'

// 原始JavaScript
xml = new XMLHttpRequest();
xml.setRequestHeader(
'Authorization', auth);
xml.open(
'GET',url) 

// ExtJS
Ext.Ajax.request({
    url : url,
    method : 
'GET',
    headers : { Authorization : auth }
}); 

// jQuery
$.ajax({
    url : url,
    method : 
'GET',
    beforeSend : 
function(req) {
        req.setRequestHeader(
'Authorization', auth);
    }
});

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

 

厄~~完!无聊的文章~~~

作者:QLeelulu

出处:http://QLeelulu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
3
0
(请您对文章做出评价)
博主上一篇:AJAX的跨域与JSONP(另送一个为文章自动添加短址的功能)
博主下一篇:SVN导出两个版本之间的差异文件
posted on 2009-11-22 02:27 Q.Lee.lulu 阅读(37759) 评论(21) 编辑 收藏

评论:
#1楼 2010-04-07 23:30 | volnet(可以叫我大V)  
我发现这篇文章在新浪微博开放平台的官方文档中有推荐!
  回复引用
#2楼 2010-05-13 15:29 | joylee  
牛人,你全才啊,啥编程语言都懂。
  回复引用
#3楼 2010-05-16 21:36 | 博客园团队  
我们参考这篇文章写了篇简单的代码示例:
http://www.cnblogs.com/cmt/archive/2010/05/13/1733904.html
  回复引用
#4楼[楼主] 2010-05-19 14:36 | Q.Lee.lulu  
@博客园团队
很高兴我的文章还能有点贡献。。。
  回复引用
#5楼 2010-05-19 22:43 | 坤坤  
@Q.Lee.lulu
你的文章贡献很大的,对于jquery方面的文章学习了很多哦。
  回复引用
#6楼 2010-06-10 23:29 | coderjoy  
这等垃圾文章也敢往上放?国外写的本来就有错,你还照翻
  回复引用
#7楼 2010-06-10 23:29 | coderjoy  
jquery的行不通
  回复引用
#8楼[楼主] 2010-06-12 14:12 | Q.Lee.lulu  
@coderjoy
请问哪里有错呢?
代码出错的了请先好好检查自己的代码。
另:指出别人错误的时候能否具体点呢?
  回复引用
#9楼 2010-06-12 16:44 | coderjoy  
jquery+php的代码运行不了,报函数未定义的错误
  回复引用
#10楼 2010-08-19 10:32 | alear  
#11楼 2010-08-26 16:29 | gshine  
python代码是有问题的,漏写了一句:
应该在theurl的定义之后添加req的定义:
1
req=urllib2.Request(theurl) 


之后就可以测试通过了,还是很感谢楼主的分享。。。。
  回复引用
#12楼 2010-09-30 12:49 | Defence  
JavaScript原始:那个方法名调错了,应该是:
var auth = make_base_auth('QLeelulu','mypassword');
不是:
var auth = make_basic_auth('QLeelulu','mypassword');

还有:
xml.setRequestHeader('Authorization', auth);
这句在IE8和FF3.5中报错
如果把这句放到xml.open()方法之后,没效果

JQuery的那个调用也是没效果,不知道是我测试的方法不对还是其他原因,用Fiddler2和FireBug查看不到设置的HttpHeader信息,估计是Jquery把错误屏蔽了

其他的没试验,多谢交流

  回复引用
#13楼 2010-09-30 14:34 | Defence  
Sorry,是我密码写错了,应该把
xml.setRequestHeader('Authorization', auth);
放到open方法之后就可以了!
  回复引用
#14楼 2010-12-07 19:49 | HallenWu  
http.headers = {"Authorization":"Basic " + user};
我想问一下这种方式服务器端一般是怎么样来判断用户名和密码是否正确呢?
难道是从header中获取到字符串解析出用户名密码,再到数据库验证吗?
  回复引用
#15楼 2011-02-08 16:39 | 打发的少[未注册用户]
Traceback (most recent call last):
File "D:/ROST/sinatpy20100906/weibo.py", line 17, in <module>
handle = urllib2.urlopen(req)
NameError: name 'req' is not defined
python error


  回复引用
#16楼 2011-02-11 22:28 | cnfi  
引用Defence:
JavaScript原始:那个方法名调错了,应该是:
var auth = make_base_auth('QLeelulu','mypassword');
不是:
var auth = make_basic_auth('QLeelulu','mypassword');

还有:
xml.setRequestHeader('Authorization', auth);
这句在IE8和FF3.5中报错
如果把这句放到xml.open()方法之后,没效果

JQuery的那个调用也是没效果,不知道是我测试的方法不对还是其他原因,用Fiddler2和FireBug查看不到设置的Ht...


这个同学和我的问题一样~我用原生js没有效果,用jquery没有返回值,唉~楼主能留下联系方式么,请教请教~
  回复引用
#17楼 2011-02-12 09:24 | Defence  
@cnfi
Sorry,是我密码写错了,应该把
xml.setRequestHeader('Authorization', auth);
放到open方法之后就可以了!
  回复引用
#18楼 2011-06-04 22:02 | p2227  
.net的也有问题
myReq url 都没定义
  回复引用
#19楼 2011-11-29 11:10 | 洛水渔翁  
JS:
xml.setRequestHeader('Authorization', auth);
这里报未指明错误。不知道为什么
  回复引用
#20楼 2011-11-29 11:12 | 洛水渔翁  
xml.setRequestHeader('Authorization', auth);
Js,报未指明错误。
  回复引用
#21楼 2012-07-27 23:04 | SuperSaiyan  
"HTTP Basic Authentication对于跨域又要发送post请求的用JavaScript是实现不了的", 对于跨域get一样无法实现.
如果跨域, get, 可以用jsonp,但无设置header, 所以, 也不行.

新的流蓝其 支持cors, get 和 post 都可以跨域
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Webapp with CLIENT-CERT authentication method
Hadoop可视化分析利器之Hue
自定义基本Http身份验证
linux+oracle10g的部署
【nodejs】使用Node.js实现REST Client调用REST API
深入理解HTTP协议之POST方法——ajax实例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服