12.2 基本认证
基本认证是最流行的 HTTP 认证协议。几乎每个主要的客户端和服务器都实现了基本认证机制。基本认证最初是在 HTTP/1.0 规范中提出的,但此后被移到了 RFC 2617 中,它详细介绍了 HTTP 的认证机制。
在基本认证中,Web 服务器可以拒绝一个事务,质询客户端,请用户提供有效的用户名和密码。服务器会返回 401 状态码,而不是 200 状态码来初始化认证质询,并用 WWW-Authenticate
响应首部指定要访问的安全域。浏览器收到质询时,会打开一个对话框,请求用户输入这个域的用户名和密码。然后将用户名和密码稍加扰码,再用 Authorization 请求首部回送给服务器。
12.2.1 基本认证实例
图 12-2 是一个详细的基本认证实例。
在图 12-2a 中,用户请求了私人家庭相片 /family/jeff.jpg。
在图12-2b 中,服务器回送一条 401 Authorization Required,对私人家庭相片进行密码质询,同时回送的还有
WWW-Authenticate
首部。这个首部请求对 Family 域进行基本认证。在图 12-2c 中,浏览器收到了 401 质询,弹出对话框,询问 Family 域的用户名和密码。用户输入用户名和密码时,浏览器会用一个冒号将其连接起来,编码成“经过扰码的” Base-64 表示形式(下节介绍), 然后将其放在
Authorization
首部中回送。在图 12-2d 中,服务器对用户名和密码进行解码,验证它们的正确性,然后用一条 HTTP 200 OK 报文返回所请求的报文。
表 12-2 总结了 HTTP 基本认证的 WWW-Authenticate
和 Authorization
首部。
表12-2 基本认证首部
质询/响应 | 首部语法及描述 |
---|---|
质询(服务器发往客户端) | 网站的不同部分可能有不同的密码。域就是一个引用字符串,用来命名所请求的文档集,这样用户就知道该使用哪个密码了:
|
响应(客户端发往服务器) | 用冒号(:)将用户名和密码连接起来,然后转换成 Base-64 编码,这样在用户名和密码中包含国际字符会稍微容易一些,也能尽量避免通过观察网络流量并只进行一些粗略的检查就可以获取用户名和密码情况的发生:
|
注意,基本认证协议并没有使用表 12-1 所示的 Authentication-Info
首部。
12.2.2 Base-64 用户名/密码编码
HTTP 基本认证将(由冒号分隔的)用户名和密码打包在一起,并用 Base-64 编码方式对其进行编码。如果不知道 Base-64 编码是什么意思,也不用担心。你并不需要对它有太多的了解,如果对此感兴趣,可以在附录 E 中读到所有与之有关的内容。简单来说,Base-64 编码会将一个 8 位字节序列划分为一些 6 位的块。用每个 6 位的块在一个特殊的由 64 个字符组成的字母表中选择一个字符,这个字母表中包含了大部分字母和数字。
图 12-4 显示了使用 Base-64 编码的基本认证实例。在这个例子中,用户名为briantotty, 密码为 Ow!。浏览器用冒号将用户名和密码连接起来,生成一个打包字符串 brian-totty:Ow!。然后对这个字符串进行 Base-64 编码,变成一串乱码:YnJpYW4tdG90dHk6T3ch。
图 12-4 从用户名和密码中生成一个基本认证首部
Base-64 编码可以接受二进制字符串、文本、国际字符表示的数据(在某些系统中会引发一些问题),将其暂时转换成一个易移植的字母表以便传输。然后,在远端就可以解码出原始字符串,而无需担心传输错误了。
有些用户名和密码中会包含国际字符或其他在 HTTP 首部中非法的字符(比如引号、冒号和回车换行符),对这些用户名和密码来说,Base-64 编码是非常有用的。而且,Base-64 编码扰乱了用户名和密码,这样也可以防止管理员在管理服务器和网络时,不小心看到用户名和密码。
12.2.3 代理认证
中间的代理服务器也可以实现认证功能。有些组织会在用户访问服务器、LAN 或无线网络之前,用代理服务器对其进行认证。可以在代理服务器上对访问策略进行集中管理,因此,通过代理服务器提供对某组织内部资源的统一访问控制是一种很便捷的方式。这个过程的第一步就是通过代理认证(proxy authentication)来识别身份。
代理认证的步骤与 Web 服务器身份验证的步骤相同。但首部和状态码都有所不同。表 12-3 列出了 Web 服务器和代理在认证中使用的状态码和首部的差异。
表12-3 Web服务器与代理认证
Web服务器 | 代理服务器 |
---|---|
Unauthorized status code: 401 | Unauthorized status code: 407 |
WWW-Authenticate | Proxy-Authenticate |
Authorization | Proxy-Authorization |
Authentication-Info | Proxy-Authentication-Info |