转自:
http://www.java265.com/JavaCourse/202204/3172.html
下文笔者讲述HttpClient支持的http身份验证方案,如下所示
服务器认证
- httpClient同服务器进行交互,
- 必须提供相应的登录凭证,这些凭证通常存储在HttpState实例中,
- 可以使用
- setCredentials(AuthScope authscope, Credentials cred)
- 和
- getCredentials(AuthScope authscope)
- 设置和查询相应的授权信息
复制代码 提前认证
- 为了减少服务器交互的开销,我们可提前设置身份验证
- client.getParams().setAuthenticationPreemptive(true);
- defaultcreds = new UsernamePasswordCredentials("username", "password");
- client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds);
- 注意事项:
- 在一些不受信任的站点中和web应用程序中,我们应谨慎使用默认凭证
- 笔者建议非调试模式,应避免使用默认账号和密码
复制代码 代理身份验证
- 代理身份验证,应使用
- setProxyCredentials(AuthScope authscope, Credentials cred)
- getProxyCredentials(AuthScope authscope)
- 设置和获取授权信息
复制代码 身份认证方案
基本认证方案
- 这是一种最原始且兼容性非常好的身份认证方案,
- 它发送给服务器的用户名和密码都是未加密的信息
复制代码 摘要式身份认证加密
- 它不通过网络传输用户名和密码,
- 而是使用用户名和密码对服务器发送过来的nonce值进行加密,作为服务器凭证传送
- 摘要式身份认证需要一个UsernamePasswordCredentials实例
复制代码 NTLM身份认证
- NTLM是HttpClient支持的最复杂的身份验证协议
- 它是由Microsoft设计的专有协议,是一个未公开可用的规范
- 早期的NTLM版本,没有Digest身份验证安全,
- 但是这些在 Windows NT 4 的服务包中得到修复,现在此协议被认为比Digest身份验证更安全
- NTLM身份验证要求NTCredentials实例可用于服务器的域名或默认凭据
- 请注意,由于NTLM不使用领域的概念
- 因此HttpClient使用服务器的域名作为领域的名称
- 另请注意,提供给NTCredentials的用户名不应以域为前缀
- 即:"username"是正确
- 而"DOMAIN\username"是不正确的
- NTLM与基本身份验证和摘要式身份验证相比
- NTLM 的工作方式存在一些显着差异
- 这些差异通常由HttpClient处理
复制代码- NTLM 身份验证的工作方式与 HttpClient API的其他身份验证几乎完全相同
- 唯一的区别是您需要提供“NTCredentials”而不是“UsernamePasswordCredentials”
- (NTCredentials 实际上扩展UsernamePasswordCredentials
- 因此如果需要,您可以在整个应用程序中使用 NTCredentials)
- NTLM 身份验证的领域是要连接的计算机的域名,
- 因为服务器通常有多个引用它们的域名
- 只有 HttpClient 连接的域名(由 HostConfiguration 指定)用于查找凭据
- 通常建议在最初测试 NTLM 身份验证时,将领域作为默认值传递给 null。
- NTLM 对连接而不是请求进行身份验证,因此每次建立新连接时都需要进行身份验证,并且在身份验证期间保持连接打开至关重要
- 因此,NTLM 不能同时用于代理和服务器的身份验证,NTLM也不能用于HTTP 1.0连接或不支持HTTP keep-alives的服务器
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |