HTTP 基本访问认证

在 HTTP 传输上下文中,基本访问认证是一种 Web 浏览器或其它客户端程序在请求中提供用户名和密码的方法。

在请求消息传输开始之前,密码被追加到用户名之后,以冒号间隔,再通过 Base64 算法编码。例如,用户名为 ‘Aladdin’ 和密码为 ‘open sesame’,得到字符串 ‘Aladdin:open sesame’ 再使用 Base64 编码,结果为 ‘QWxhZGRpbjpvcGVuIHNlc2FtZQ==’。经过 Base64 编码的字符串将被包含在 HTTP 请求消息头中传输给接收方,结果是冒号分隔的用户名和密码。

使用 Base64 算法加密用户名和密码为不可读状态,不能保证数据的安全性,仅仅可以保证传输数据是 HTTP 协议的兼容字符。

HTTP 基本访问认证规范于 1996 年定义在 RFC 1945 (Hypertext Transfer Protocol – HTTP/1.0)中。后续包含安全相关的规范在 RFC 2616 (Hypertext Transfer Protocol – HTTP/1.1) 和 RFC 2617 (HTTP Authentication: Basic and Digest Access Authentication)中被定义。

HTTP/1.1 协议同时支持 基本访问认证 和 数字访问认证。

示例
HTTP 客户端和 HTTP 服务器进行一次 基本访问认证 的典型步骤如下:

  • 客户端发起一个页面(需要认证的)请求时并无提供用户名和密码信息。(通常因为用户直接在地址栏中输入链接)
  • 服务器回应响应码为 401(”Unauthorized”)的消息,包含需要 scheme 和 realm。
  • 此刻,客户端会以提示消息的形式显示服务器发送过来的 realm,并要求用户输入用户名和密码并继续,也可取消停止。
  • 当客户端获得了用户输入的用户名和密码后,将 base64encode(username+”:”+password) 加入到之前的请求消息头中再次发送。
  • 在这个例子中,当服务端认证用户名和密码有效时,请求的页面将会返回;否则将返回响应码为 401 的页面,要求用户重要进行认证。

提示:客户端可在首次请求中携带认证信息,可直接跳过交互过程。

客户端请求(不包含认证信息)

GET /private/index.html HTTP/1.1
Host: localhost

服务器响应

HTTP/1.1 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>

客户端请求(包含认证信息,用户名 “Aladdin”, 密码 “open sesame”)

GET /private/index.html HTTP/1.1
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

服务器响应消息

HTTP/1.1 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

引用
http://en.wikipedia.org/wiki/Basic_access_authentication

Over!