1. 程式人生 > >精講RestTemplate第9篇-如何通過HTTP Basic Auth認證

精講RestTemplate第9篇-如何通過HTTP Basic Auth認證

本文是精講RestTemplate第9篇,前篇的blog訪問地址如下: * [精講RestTemplate第1篇-在Spring或非Spring環境下如何使用](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac1%e7%af%87-%e5%9c%a8spring%e6%88%96%e9%9d%9espring%e7%8e%af%e5%a2%83%e4%b8%8b%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8/.html) * [精講RestTemplate第2篇-多種底層HTTP客戶端類庫的切換](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac2%e7%af%87-%e5%a4%9a%e7%a7%8d%e5%ba%95%e5%b1%82http%e5%ae%a2%e6%88%b7%e7%ab%af%e7%b1%bb%e5%ba%93%e7%9a%84%e5%88%87%e6%8d%a2/.html) * [精講RestTemplate第3篇-GET請求使用方法詳解](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac3%e7%af%87-get%e8%af%b7%e6%b1%82%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%e8%af%a6%e8%a7%a3/.html) * [精講RestTemplate第4篇-POST請求方法使用詳解](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac4%e7%af%87-post%e8%af%b7%e6%b1%82%e6%96%b9%e6%b3%95%e4%bd%bf%e7%94%a8%e8%af%a6%e8%a7%a3/.html) * [精講RestTemplate第5篇-DELETE、PUT等請求方法使用詳解](http://www.zimug.com/java/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac4%e7%af%87-delete%e3%80%81put%e7%ad%89%e8%af%b7%e6%b1%82%e6%96%b9%e6%b3%95%e4%bd%bf%e7%94%a8%e8%af%a6%e8%a7%a3/.html) * [精講RestTemplate第6篇-檔案上傳下載與大檔案流式下載](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac6%e7%af%87-%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b8%8b%e8%bd%bd%e4%b8%8e%e5%a4%a7%e6%96%87%e4%bb%b6%e6%b5%81%e5%bc%8f%e4%b8%8b%e8%bd%bd/.html) * [精講RestTemplate第7篇-自定義請求失敗異常處理](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac7%e7%af%87-%e8%87%aa%e5%ae%9a%e4%b9%89%e8%af%b7%e6%b1%82%e5%a4%b1%e8%b4%a5%e5%bc%82%e5%b8%b8%e5%a4%84%e7%90%86/.html) * [精講RestTemplate第8篇-請求失敗自動重試機制](http://www.zimug.com/java/spring/%e7%b2%be%e8%ae%b2resttemplate%e7%ac%ac8%e7%af%87-%e8%af%b7%e6%b1%82%e5%a4%b1%e8%b4%a5%e8%87%aa%e5%8a%a8%e9%87%8d%e8%af%95%e6%9c%ba%e5%88%b6/.html) 服務提供方通常會通過一定的授權、鑑權認證邏輯來保護API介面。其中比較簡單、容易實現的方式就是使用HTTP 的Basic Auth來實現介面訪問使用者的認證。我們本節就來為大家介紹一下,在服務端加入Basic Auth認證的情況下,該如何使用RestTemplate訪問服務端介面。 ## 一、HttpBasic認證原理說明 ![](https://img2020.cnblogs.com/other/1815316/202008/1815316-20200816135454336-2109209733.png) * 首先,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登入認證模式》](https://www.kancloud.cn/hanxt/springsecurity/1221483) 。 當然我們也可以不用自己去搭建服務端,給大家介紹一個提供免費線上的RESTful介面服務的網站:httpbin.com。這個網站為我們提供了Basic Auth認證測試服務介面。如果我們只是為了學習RestTemplate,直接用這個網站提供的服務就可以了。 ![](https://img2020.cnblogs.com/other/1815316/202008/1815316-20200816135454642-99404315.png) 瀏覽器訪問地址:[http://www.httpbin.org/#/Auth/get\_basic\_auth\_\_user\_\_\_passwd\_](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())); //傳送請求 Ht