这篇文章主要为大家介绍了RestTemplate如何通过HTTP?Basic?Auth认证的示例说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

服务提供商通常通过某些授权和认证逻辑来保护API接口。其中,更简单易行的方法是使用HTTP的基本Auth来实现接口访问用户的认证。在本节中,我们将向您介绍当服务器加入基本Auth认证时,如何使用RestTemplate访问服务器接口。


一、HttpBasic认证原理说明


首先,HttpBasic模式要求传输的用户名和密码使用Base64模式加密。如果用户名是quotadminquot,密码是ampldquoadminamprdquo,字符串quot管理:管理quot;使用Base64编码算法加密。加密结果可能是:YWtaW46YWRtaW4=。

然后,授权被用作HTTP请求中的Http请求头。标题名称,ampldquo基本YWtaW46YWRtaW4 = ampldquo作为Header的值,发送给服务器。(注意这里使用的是Basic+空case+加密字符串)

当服务器收到这样的请求时,它到达BasicAuthenticationFilter过滤器,并将提取ampldquo授权amp。rdquo头值,并使用用于验证用户身份的相同算法Base64对其进行解码。

解码结果匹配登录验证的用户名和密码。如果匹配成功,则可以继续过滤器的后续访问。


二、HTTP Basic Auth服务端实现

如果要自己搭建服务器,如何为Spring Boot服务添加基本Auth认证?请参考我的另一篇文章:Spring Security系列的Http Basic Auth登录认证方式。

当然,我们不一定要建立自己的服务器,所以我们可以向您介绍一个提供免费在线RESTful接口服务的网站:httpbin.com。该网站为我们提供了基本的Auth认证测试服务界面。如果只是想学习RestTemplate,直接使用这个网站提供的服务就可以了。


浏览器访问地址:http://www.httpbin.org/

这个接口服务是通过OpenAPI(swagger)实现的,所以可以在线测试。所以可以先通过页面操作测试一下,然后学习使用RestTemplate访问服务器接口。


三、请求头方式携带认证信息

由基本Auth认证的用户名和密码被携带在HTTP请求报头中。具体实现请参考以下代码注释:

@SpringBootTestclassBasicAuthTests{@ResourceprivateRestTemplaterestTemplate;@TestvoidtestBasicAuth(){//该url上携带用户名密码是httpbin网站测试接口的要求,//真实的业务是不需要在url上体现basicauth用户名密码的Stringurl=quot;http://www.httpbin.org/basic-auth/admin/adminpwdquot;;//在请求头信息中携带Basic认证信息(这里才是实际Basic认证传递用户名密码的方式)HttpHeadersheaders=newHttpHeaders();headers.set(quot;authorizationquot;,quot;Basicquot;+Base64.getEncoder().encodeToString(quot;admin:adminpwdquot;.getBytes()));//发送请求HttpEntitylt;Stringgt;ans=restTemplate.exchange(url,HttpMethod.GET,//GET请求newHttpEntitylt;gt;(null,headers),//加入headersString.class);//body响应数据接收类型System.out.println(ans);}}

测试用例的成功执行表明RestTemplate正确携带了基本的认证信息,正常的响应结果是200。



四、拦截器方式携带认证信息

第三节的代码虽然实现了功能,但是还不够好。因为我们每次发送HTTP请求,都需要组装HttpHeaders信息,这样不好,导致大量代码冗余。那么有没有办法一次给所有RestTemplate请求API添加Http基本认证信息呢?答案是:RestTemplate Bean初始化时,添加了一个拦截器,以拦截器的方式统一添加基本的认证信息。

以下代码与注释一起阅读。如果看不懂,需要参考一下:

解释RestTemplate第2章——各种底层HTTP客户端类库的切换


@ConfigurationpublicclassContextConfig{@Bean(quot;OKHttp3quot;)publicRestTemplateOKHttp3RestTemplate(){RestTemplaterestTemplate=newRestTemplate(getClientHttpRequestFactory());//添加拦截器restTemplate.getInterceptors().add(getCustomInterceptor());returnrestTemplate;}//实现一个拦截器:使用拦截器为每一个HTTP请求添加BasicAuth认证用户名密码信息privateClientHttpRequestInterceptorgetCustomInterceptor(){ClientHttpRequestInterceptorinterceptor=(httpRequest,bytes,execution)-gt;{httpRequest.getHeaders().set(quot;authorizationquot;,quot;Basicquot;+Base64.getEncoder().encodeToString(quot;admin:adminpwdquot;.getBytes()));returnexecution.execute(httpRequest,bytes);};returninterceptor;}//这段代码是《第3节-底层HTTP客户端实现切换》的内容privateClientHttpRequestFactorygetClientHttpRequestFactory(){inttimeout=100000;OkHttp3ClientHttpRequestFactoryclientHttpRequestFactory=newOkHttp3ClientHttpRequestFactory();clientHttpRequestFactory.setConnectTimeout(timeout);returnclientHttpRequestFactory;}}

在RestTemplate Bean初始化时添加拦截器之后,第三节中的代码可以省略HttpHeaders基本Auth请求头携带的信息的组装过程。请求,结果与第三小节中的结果相同。


五、进一步简化

上面的方法使用了一个拦截器,但是我们仍然自己封装HTTP headers请求头信息。进一步的简化方法是Spring RestTemplate为我们提供了一个打包的基本Auth拦截器。我们可以直接使用它,不需要自己实现拦截器。


下面的方法是在实例化RestTemplate Bean时使用RestTemplateBuilder,它带有basicAuthentication。所以这里不需要拦截器(实际底层代码实现还是拦截器,只是api层面不需要指定拦截器)。


请求,结果与第三小节中的结果相同。

以上是RestTemplate如何通过HTTP Basic Auth的认证的细节。更多HTTP基本Auth的RestTemplate认证信息