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


Posted in Java/Android onMarch 17, 2022

服务提供方通常会通过一定的授权、鉴权认证逻辑来保护API接口。其中比较简单、容易实现的方式就是使用HTTP 的Basic Auth来实现接口访问用户的认证。我们本节就来为大家介绍一下,在服务端加入Basic Auth认证的情况下,该如何使用RestTemplate访问服务端接口。

一、HttpBasic认证原理说明

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

首先,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,直接用这个网站提供的服务就可以了。

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

浏览器访问地址:http://www.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://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。

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

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

第三小节中的代码虽然实现了功能,但是不够好。因为每一次发送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 Bean初始化的时候加入拦截器之后,第三小节中的代码就可以省略HttpHeaders Basic Auth请求头携带信息的组装过程。发送请求,结果和第三小节中的效果是一样的。

五、进一步简化

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

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

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

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

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

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

Java/Android 相关文章推荐
Java Optional<Foo>转换成List<Bar>的实例方法
Jun 20 Java/Android
springboot集成flyway自动创表的详细配置
Jun 26 Java/Android
Java常用工具类汇总 附示例代码
Jun 26 Java/Android
Java实现多文件上传功能
Jun 30 Java/Android
详细了解java监听器和过滤器
Jul 09 Java/Android
Lombok的详细使用及优缺点总结
Jul 15 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
SpringBoot中HttpSessionListener的简单使用方式
Mar 17 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
零基础学java之带参数以及返回值的方法
Apr 10 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 Java/Android
Java实现二分搜索树的示例代码
使用HttpSessionListener监听器实战
Mar 17 #Java/Android
spring cloud eureka 服务启动失败的原因分析及解决方法
Mar 17 #Java/Android
Java基于Dijkstra算法实现校园导游程序
Java中的随机数Random
Mar 17 #Java/Android
SpringBoot中HttpSessionListener的简单使用方式
Mar 17 #Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
Mar 17 #Java/Android
You might like
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
浅析Python四种数据类型
2018/09/26 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
python源文件的字符编码知识点详解
2021/03/04 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
标记环介质访问控制协议
2016/03/27 面试题
人资专员岗位职责
2014/04/04 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
网络营销实训总结
2015/08/03 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技