第三方接口对接:摘要认证 Digest access authentication
HTTP认证方式:
BASIC 认证(基本认证);
DIGEST 认证(摘要认证);
SSL 客户端认证;
FormBase 认证(基于表单认证);
1、摘要认证流程:
(1) 服务器计算出一个随机数。
(2) 服务器将这个随机数放在 WWW-Authenticate 质询报文中,与服务器所支持的算法列表一同发往客户端。
(3) 客户端选择一个算法,计算出密码和其他数据的摘要。
(4) 客户端将摘要放在一条 Authorization 报文中发回服务器。如果客户端要对服务器进行认证,可以发送客户端随机数。
(5) 服务器接收摘要、选中的算法以及支撑数据,计算出与客户端相同的摘要。然后服务器将本地生成的摘要与网络传送过来的摘要进行比较,验证是否匹配。如果客户端反过来用客户端随机数对服务器进行质询,就会创建客户端摘要。服务器可以预先将下一个随机数计算出来,提前将其传递给客户端,这样下一次客户端就可以预先发送正确的摘要了。
2、算法参考:网上一大堆
3、摘要认证Client的简单实现:
// 账户密码认证
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
new UsernamePasswordCredentials("用户名", "密码");
SSLConnectionSocketFactory sslConnectionSocketFactory;
try {
// 忽略SSL证书校验
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext);
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
log.error("获取验证账户密码的Digest客户端:失败");
throw new RmtCallUnHandleException("获取验证账户密码的Digest客户端:失败");
}
// config等其他未配置:返回认证的HttpClint对象
return HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).setSSLSocketFactory(sslConnectionSocketFactory).build();
记录一次工作上遇到的坑,,新手,,大佬勿喷