无聊想调用下嘀咕的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的吧:
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访问跨域资源的,是可以的)。。
厄~~完!无聊的文章~~~
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容