基本连接验证(Basic Access Authorization)的原理

前段时间在搞GTAP,最近又研究ZendFramework的Auth模块,重新又对身份认证的这个小东西小小的研究了一小下。在查找资料时,同样没有在中文互联网内找到什么可用的资源。以下文字大部分翻译自wikipedia关于Basic Access Authorization的英文页面

我们通常说的基于HTTP的基本验证(Basic Authorization)的英文全称应该是“Basic Access Authorization”,这是在RFC2617中定义的。

在一个HTTP交互的过程中,“基本连接认证”(没有找到中文翻译,姑且这么叫吧)是一个允许浏览器或其他客户端程序在发起请求时向服务器端以用户名+密码的方式提供身份证明的方法。

在传输之前,用户名和密码被一个冒号连接在一起,并以base64算法进行编码,如用户名“kevin”和密码“9511.net”先用冒号进行连接成“kevin:9511.net”,然后再对这个新字符串用base64算法编码,结果就是“a2V2aW46OTUxMS5uZXQ==”。这个经base64算法编码后的字符串被提交到服务器端,并由服务器端用base64算法进行解码,然后用一个冒号分割出用户名和密码,最后由服务器端针对用户和密码进行认证。

在具体的传输环节上,由于此认证方式是基于HTTP协议,所以请求和响应的内容都是存在于header中。For Example:

客户端请求
GET /private/index.html HTTP/1.0
Host: localhost

服务器端响应:
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”  <==必要值,realm的值可自定义
Content-Type: text/html
Content-Length: 311

此时客户端收到响应后,会出现一个对话框,由用户填写用户名和密码。并将用户填写的内容经处理发送到服务器端:
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic a2V2aW46OTUxMS5uZXQ==

服务端对再次收到的数据进行处理,如果认为此用户通过,则返回正常的请求结果。

基本连接认证的整个过程就是这么简单,在最流行、装机量最大的WEB服务器软件apache中内置了对基本连接认证的支持。怎么在apache内配置实用,网上到处都是复制来复制去的文章,就不多说了。

其实包括PHP在内的语言好多语言,都可以通过自定义header信息来提供独立于web server之外的基本连接认证支持。比如PHP,如果一个Request中包含“Authorization: Basic a2V2aW46OTUxMS5uZXQ==”这样的内容,PHP就会将“a2V2aW46OTUxMS5uZXQ==”进行解码然后将用户名和密码分别放入$_SERVER[‘PHP_AUTH_USER’]和$_SERVER[‘PHP_AUTH_PW’]两个超全局变量中,那么剩下的就跟上面说的过程都一样了。

另:如上所述,HTTP的“基本连接认证”虽然经过base64编码,但基本等同于明文传输,是非常不安全的,只能提供最最简单、最最初级的安全防护。但HTTPS的连接,header中的Authorization信息是不会明文传输的,所以还算是较为安全的。

$_SERVER[‘PHP_AUTH_USER’]))

基本连接验证(Basic Access Authorization)的原理》有2个想法

  1. Pingback引用通告: vvoody’s woody house » Blog Archive » 对gtap的一些wordaround

  2. Pingback引用通告: 对gtap的一些wordaround – 马开东博客

发表评论

邮箱地址不会被公开。 必填项已用*标注