关于spring:精讲RestTemplate第9篇如何通过HTTP-Basic-Auth认证

35次阅读

共计 3633 个字符,预计需要花费 10 分钟才能阅读完成。

本文是精讲 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 认证的用户名和明码,具体实现参考下文代码正文:

@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。

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

第三大节中的代码尽管实现了性能,然而不够好。因为每一次发送 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 Bean 实例化的时候应用 RestTemplateBuilder,自带 basicAuthentication。所以到这里拦截器也不须要了(理论底层代码实现依然是拦截器,只是 api 层面不须要指定拦截器了)。

发送申请,后果和第三大节中的成果是一样的。

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》

正文完
 0