商业性 Web 站点大都提供站点认证功能以保护某些受限资源,HTTP 协议和 J2EE 规范对 Web 站点的认证过程都已有了详尽的定义,常见浏览器都能根据相应协议提供对应的界面形式帮助用户完成站点的认证过程。但在某些情况下,我们需要编写程序直接获取站点的受保护资源,在这类情况下,就不能利用浏览器给定的界面去完成认证,而需要我们根据不同的协议人工地发送相应请求以完成整个认证过程。本文根据这种需求给出一个基于 Apache HttpClient 应用包的解决方案。
J2EE 站点认证简介
出于安全性的需要和用户授权管理的考虑,常见的 J2EE 站点对特定资源都会加入认证/授权机制。例如一个公网上的论坛,一个只对特定用户开放的 RSS 或 Atom Feed,这些资源都必须在确信访问者为被授权用户时才能向访问者开放。为了实现这样的功能,J2EE 站点通常会采用某种站点认证机制,其中常见的有 HTTP Basic 认证和 J2EE Form-Based 认证。
HTTP Basic 认证
HTTP Basic 认证是 HTTP 认证协议(rfc2617)所定义的标准认证方式。要求 HTTP Basic 认证的服务器会在客户端访问受保护资源时向客户端发出请求,要求客户端上传用户名和密码对。服务器在收到用户名/密码并验证通过后,才将保护资源的内容返回给客户端。它的工作机制如下图:
图 1. HTTP Basic 认证原理
由于是 HTTP 规范,因而常见的浏览器,如 Internet Explorer,Mozilla Firefox,在 步骤 2 中收到服务器对用户名和密码的请求时会弹出认证对话框,供用户输入用户名/密码。
图 2. Firefox 在收到步骤 2 中请求时弹出的用户名/密码输入框
HTTP Basic 认证方式使用 base64 编码方式传送用户名和密码,而 base64 仅仅是一种公开的编码格式而非加密措施,因而如果信道本身不使用 SSL 等安全协议,用户密码较容易被截获。