RestTemplate如何通过HTTP Basic Auth认证示例说明

网友投稿 1019 2022-10-20

RestTemplate如何通过HTTP Basic Auth认证示例说明

RestTemplate如何通过HTTP Basic Auth认证示例说明

目录一、HttpBasic认证原理说明二、HTTPBasicAuth服务端实现三、请求头方式携带认证信息四、-方式携带认证信息五、进一步简化

本文是精讲RestTemplate第9篇,前篇的blog访问地址如下:

RestTemplate在Spring或非Spring环境下使用精讲

RestTemplate实现多种底层HTTP客户端类库的切换用法

RestTemplate发送HTTP GET请求使用方法详解

RestTemplate发送HTTP POST请求使用方法详解

RestTemplate的DELETE及PUT等请求方法使用精讲

RestTemplate文件上传-与大文件流式-

RestTemplate自定义请求失败异常处理示例解析

RestTemplate请求失败自动重启机制精讲

服务提供方通常会通过一定的授权、鉴权认证逻辑来保护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://httpbin.org/#/Auth/get_basic_auth__user___passwd_

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

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

在HTTP请求头中携带Basic Auth认证的用户名和密码,具体实现参考下文代码注释:

@SpringBootTest

class BasicAuthTests {

@Resource

private RestTemplate restTemplate;

@Test

void testBasicAuth() {

//该url上携带用户名密码是httpbin网站测试接口的要求,

//真实的业务是不需要在url上体现basic auth用户名密码的

String url = "http://httpbin.org/basic-auth/admin/adminpwd";

//在请求头信息中携带Basic认证信息(这里才是实际Basic认证传递用户名密码的方式)

Htthttp://pHeaders headers = new HttpHeaders();

headers.set("authorization",

"Basic " +

Base64.getEncoder()

.encodeToString("admin:adminpwd".getBytes()));

//发送请求

HttpEntity 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客户端类库的切换

@Configuration

public 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 IGQNwRAekMBean初始化的时候加入-之后,第三小节中的代码就可以省略HttpHeaders Basic Auth请求头携带信息的组装过程。发送请求,结果和第三小节中的效果是一样的。

五、进一步简化

上面的方式使用了-,但仍然是我们自己来封装HTTP headers请求头信息。进一步的简化方法就是,Spring RestTemplate 已经为我们提供了封装好的Basic Auth-,我们直接使用就可以了,不需要我们自己去实现-。

下面的方法是在RestTemplate Bean实例化的时候使用RestTemplateBuilder,自带basicAuthentication。所以到这里-也不需要了(实际底层代码实现仍然是-,只是api层面不需要指定-了)。

发送请求,结果和第三小节中的效果是一样的。

以上就是RestTemplate如何通过HTTP Basic Auth认证示例说明的详细内容,更多关于RestTemplate认证HTTP Basic Auth的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:聊聊Mybatis的binding模块之MapperMethod
下一篇:.Net简单的微ORM框架:NPoco
相关文章

 发表评论

暂时没有评论,来抢沙发吧~