这两天碰到一个需求,需要访问公司另一个服务的远程接口,日常也开始接触学习springcloud,想到了feign,比直接用httpclient要方便许多。但是一上手发现对方在请求时需要进行摘要认证,而feign找了半天只有简单的Basic认证。这两种认证的原理和区别就不说了。最终我找了些资料解决了这个问题,直接上代码吧。
首先引入依赖,注意这里得引入一个feign-httpclient,保证有一个ApacheHttpClient实现
@Bean
public CloseableHttpClient feignClient() throws Exception {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
CredentialsProvider provider = new BasicCredentialsProvider();
// 添加摘要认证的信息包括主机、端口、realm和用户名密码等
provider.setCredentials(new AuthScope("127.0.0.1",8080,"realm",AuthScope.ANY_SCHEME),
new UsernamePasswordCredentials("username", "password"));
return HttpClientBuilder.create().setDefaultCredentialsProvider(provider)
.setSSLSocketFactory(csf)
.useSystemProperties().build();
}
这样,我们在用feign实现远程调用时就可以使用摘要认证。基本思路就是用HttpClient代替feign默认的Client(除了Httpclient还有OkHttp),同时使用它的摘要认证实现方式即可。
其中AuthScope表示由主机名,端口号,领域名称和认证方案名称组成的认证范围。主要有ANY,ANY_HOST,ANY_PORT,ANY_REALM,ANY_SCHEME和自定义,其中认证方案名称有Basic,Digest和NTLM,代码中选了ANY_SCHEME表示主机可能支持的任何一种认证方案。