简介
HttpClient支持三种不同形式的HTTP协议验证发难:Basic,Digest和NTLM。这些都可以解决同http服务器或是代理服务器之间的认证。
认证服务器
HttpClient处理服务器认证几乎是透明的,发开者只需要做一件事情,提供一个合法login证书。此证书被保存到HttpState实例中并且可调用方法setCredentials(AuthScopeauthscope, Credentials cred)和getCredentials(AuthScope authscope)方法设置和得到。
HttpClient的内置自动认证机制可通过HttpMethod类中的setDoAuthentication(boolean doAuthenticaiton)方法废弃掉。这样做你只会影响到method的实例。
Preemptive Authentication(抢先认证)
用HttpClient可以实现Preemptive authenticaiton。这种方式HttpClient会发送基本的认证Response,有些情况下,会在服务器返回一个未经授权的Response之前就发出去,从而使连接减少了开销。你可以像下面这样使用它
client.getParams().setAuthenticationPreemptive ( true);
这种方式也要求必须为目标服务器或是代理服务器设置默认证书。若不能提供默认的证书将会使Preemptive Authentication(抢先认证)的方式失效。
Credentials defaultcreds = new UsernamePasswordCredentials(“username”, “passowrd”);
Client.getState().setCredentials(new AuthScope(“myhost”, 80, AuthScope.ANY_REALM), defaultcreds);
Security aspects of server authentication(安全服务器验证)
使用默认证书开发应用时,可能会与安全web站点或是普通web站点进行通信。当Preemtive authentication被激活或是证书未给出一个明确的认证领域和主机时,HttpClient尝试使用默认证书与目标站点去验证。如果你想避免发送证书去一个不信任的站点尽可能的缩小的证书范围:始终指定主机。
在正式产品中禁止使用AuthScope.ANY验证域去设置证书。这样做会发送所有的证书。
这样设置方式只应该在debugging阶段使用。
// To be avoided unless in debug mode
Credentials defaultcreds = new UsernamePasswordCredentials(“username”, “password”);
Client.getState().setCredentials(AuthScope.ANY, defaultcreds);
Proxy Authentication(代理认证)
Basic
Basic authentication是最原始最和谐的一种认证方案。遗憾的是,这也是最不安全,因为它发送到服务器的用户名和密码是没有经过加密的。Basic authentication需要一个UsernamePasswordCredentials的实例去实现,无论是特定领域还是默认的证书。
Digest
Disgest authectication在HTTP1.1协议中添加进来,这种方案并没有像Basic authectication广泛的使用起来。Digest authentication明显要比Basic authentication方案安全,因为它传送加密以后的用户名和密码。
Digest authentication需要一个UsernamePasswordCredentials的实例。
NTLM
NTLM是HttpClient所支持的最复杂的一种认证协议。这是一个专利协议,由Microsoft设计,也没有公开其标准。NTLM早期的版本由于设计的错误导致安全性较Digest authentication差,然而在Windows NT 4修复了这个BUG,现在认为就安全性要比Digest authenticaiton安全。