本文是精讲RestTemplate第9篇,前篇的blog拜访地址如下:
- 精讲RestTemplate第1篇-在Spring或非Spring环境下如何应用
- 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
- 精讲RestTemplate第3篇-GET申请应用办法详解
- 精讲RestTemplate第4篇-POST申请办法应用详解
- 精讲RestTemplate第5篇-DELETE、PUT等申请办法应用详解
- 精讲RestTemplate第6篇-文件上传下载与大文件流式下载
- 精讲RestTemplate第7篇-自定义申请失败异样解决
- 精讲RestTemplate第8篇-申请失败主动重试机制
服务提供方通常会通过肯定的受权、鉴权认证逻辑来爱护API接口。其中比较简单、容易实现的形式就是应用HTTP 的Basic Auth来实现接口拜访用户的认证。咱们本节就来为大家介绍一下,在服务端退出Basic Auth认证的状况下,该如何应用RestTemplate拜访服务端接口。
一、HttpBasic认证原理阐明
- 首先,HttpBasic模式要求传输的用户名明码应用Base64模式进行加密。如果用户名是
"admin"
,明码是“ admin”,则将字符串"admin:admin"
应用Base64编码算法加密。加密后果可能是:YWtaW46YWRtaW4=。 - 而后,在Http申请中应用authorization作为一个HTTP申请头Header name,“Basic YWtaW46YWRtaW4=“作为Header的值,发送给服务端。(留神这里应用Basic+空格+加密串)
- 服务器在收到这样的申请时,达到BasicAuthenticationFilter过滤器,将提取“authorization”的Header值,并应用用于验证用户身份的雷同算法Base64进行解码。
- 解码后果与登录验证的用户名明码匹配,匹配胜利则能够持续过滤器后续的拜访。
二、HTTP Basic Auth服务端实现
如果你想本人搭建一个服务端,那么如何为Spring Boot 服务增加Basic Auth认证?请参考我的另外一篇文章:《Spring Security系列之Http Basic Auth登录认证模式》 。
当然咱们也能够不必本人去搭建服务端,给大家介绍一个提供收费在线的RESTful接口服务的网站:httpbin.com。这个网站为咱们提供了Basic Auth认证测试服务接口。如果咱们只是为了学习RestTemplate,间接用这个网站提供的服务就能够了。
浏览器拜访地址:http://www.httpbin.org/#/Auth/get_basic_auth__user___passwd_ ,这个接口服务是通过OpenAPI(swagger)实现的,所以能够进行在线的拜访测试。所以能够先通过页面操作测试一下,再开始上面学习应用RestTemplate拜访服务端接口。
三、申请头形式携带认证信息
在HTTP申请头中携带Basic Auth认证的用户名和明码,具体实现参考下文代码正文:
@SpringBootTestclass BasicAuthTests { @Resource private RestTemplate restTemplate; @Test void testBasicAuth() { //该url上携带用户名明码是httpbin网站测试接口的要求, //实在的业务是不须要在url上体现basic auth用户名明码的 String url = "http://www.httpbin.org/basic-auth/admin/adminpwd"; //在申请头信息中携带Basic认证信息(这里才是理论Basic认证传递用户名明码的形式) HttpHeaders headers = new HttpHeaders(); headers.set("authorization", "Basic " + Base64.getEncoder() .encodeToString("admin:adminpwd".getBytes())); //发送申请 HttpEntity<String> ans = restTemplate .exchange(url, HttpMethod.GET, //GET申请 new HttpEntity<>(null, headers), //退出headers String.class); //body响应数据接管类型 System.out.println(ans); } }
测试用例执行胜利,阐明RestTemplate 正确的携带了Basic 认证信息,失去失常的响应后果:200。
四、拦截器形式携带认证信息
第三大节中的代码尽管实现了性能,然而不够好。因为每一次发送HTTP申请,咱们都须要去组装HttpHeaders 信息,这样不好,造成大量的代码冗余。那么有没有一种形式能够实现能够一次性的为所有RestTemplate申请API增加Http Basic认证信息呢?答案就是:在RestTemplate Bean初始化的时候退出拦截器,以拦截器的形式对立增加Basic认证信息。
上面的代码联合正文去看,如果看不懂,须要去参考:精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
@Configurationpublic class ContextConfig { @Bean("OKHttp3") public RestTemplate OKHttp3RestTemplate(){ RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); //增加拦截器 restTemplate.getInterceptors().add(getCustomInterceptor()); return restTemplate; } //实现一个拦截器:应用拦截器为每一个HTTP申请增加Basic Auth认证用户名明码信息 private ClientHttpRequestInterceptor getCustomInterceptor(){ ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, execution) -> { httpRequest.getHeaders().set("authorization", "Basic " + Base64.getEncoder() .encodeToString("admin:adminpwd".getBytes())); return execution.execute(httpRequest, bytes); }; return interceptor; } //这段代码是《第3节-底层HTTP客户端实现切换》的内容 private ClientHttpRequestFactory getClientHttpRequestFactory() { int timeout = 100000; OkHttp3ClientHttpRequestFactory clientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory(); clientHttpRequestFactory.setConnectTimeout(timeout); return clientHttpRequestFactory; }}
在RestTemplate Bean初始化的时候退出拦截器之后,第三大节中的代码就能够省略HttpHeaders Basic Auth申请头携带信息的组装过程。发送申请,后果和第三大节中的成果是一样的。
五、进一步简化
下面的形式应用了拦截器,但依然是咱们本人来封装HTTP headers申请头信息。进一步的简化办法就是,Spring RestTemplate 曾经为咱们提供了封装好的Basic Auth拦截器,咱们间接应用就能够了,不须要咱们本人去实现拦截器。
上面的办法是在RestTemplate Bean实例化的时候应用RestTemplateBuilder,自带basicAuthentication。所以到这里拦截器也不须要了(理论底层代码实现依然是拦截器,只是api层面不须要指定拦截器了)。
发送申请,后果和第三大节中的成果是一样的。
欢送关注我的博客,外面有很多精品合集
- 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端拆散RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》