构建RESTful Web Service - 验证的实现和使用(HTTP 基本认证)

因为RESTful的无状态特性,导致无法知道当前的请求方是否可靠,所以不得不对每次请求进行验证。但是如何更语义化的将需要验证的信息附加到HTTP里呢?现在比较常见的方式是把验证信息作为参数发送过去,但是这样会违反RESTful的原则。例如,GET /user/1/xx验证信息xx。幸好的是HTTP协议本身定义了两种认证方式,Basic和Digest。

[size=large][b]一、HTTP 基本认证(Basic Athorization)[/b][/size]
[size=medium][b]I.简介[/b][/size]
HTTP基本认证比较简单,明文发送,没有签名,安全性低,没作用域,只能适用于一般场合。

整个交互过程如下:
[list=1]
[*]用户访问需要认证的页面
[*]服务端验证失败,响应401状态码,并响应WWW-Authenticate报头
[*]客户端收到WWW-Authenticate报头,表示要提供认证信息
[*]客户端将用户名和密码使用:号连接,并base64编码后方在报头里发送回服务端
[/list]例子:
1.客户端发起请求,无发送认证信息:
GET /private/index.html HTTP/1.0
Host: localhost

2.服务端响应
HTTP/1.0 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>

3.客户端发起有认证信息的请求
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

4.服务端响应
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

[size=medium][b]II.服务端的实现[/b][/size]
认证失败响应
header('WWW-Authenticate: Basic realm="Test"');
header('HTTP/1.1 401 Unauthorized');

客户端发送过来的用户名和密码通过 $_SERVER['PHP_AUTH_USER'] 和 $_SERVER['PHP_AUTH_PW'] 获得

[size=medium][b]III.客户端的使用[/b][/size]
[b]1.PHP/cURL[/b]
只需两个设置就可以实现HTTP 基本认证。
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');


[b]2.Javascript/AJAX[/b]
XMLHttpRequest对象的open方法提供了设置参数
xhr.open("GET", "/", true, "username", "password")


如果使用jQuery的话,用$.ajax方法
$.ajax({username : "username", password : "password"})


[b]3.Linux/cURL[/b]
命令行下使用cURL发起请求
curl -u username:password http://localhost/ 


参考资料:
[url=http://www.ietf.org/rfc/rfc2617.txt]HTTP Authentication: Basic and Digest Access Authentication[/url]
[url=http://en.wikipedia.org/wiki/Digest_access_authentication]Digest access authentication[/url]
[url=http://en.wikipedia.org/wiki/Basic_access_authentication]Basic access authentication[/url]
[url=http://hi.baidu.com/thinkinginlamp/blog/item/16f6d933f131b644ad4b5f98.html]Form形式的HTTP Basic Authentication[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值