RestTemplate如何通過HTTP?Basic?Auth認證示例說明
本文是精講RestTemplate第9篇,前篇的blog訪問地址如下:
RestTemplate在Spring或非Spring環(huán)境下使用精講
RestTemplate實現(xiàn)多種底層HTTP客戶端類庫的切換用法
RestTemplate發(fā)送HTTP GET請求使用方法詳解
RestTemplate發(fā)送HTTP POST請求使用方法詳解
RestTemplate的DELETE及PUT等請求方法使用精講
服務提供方通常會通過一定的授權(quán)、鑒權(quán)認證邏輯來保護API接口。其中比較簡單、容易實現(xiàn)的方式就是使用HTTP 的Basic Auth來實現(xiàn)接口訪問用戶的認證。我們本節(jié)就來為大家介紹一下,在服務端加入Basic Auth認證的情況下,該如何使用RestTemplate訪問服務端接口。
一、HttpBasic認證原理說明
首先,HttpBasic模式要求傳輸?shù)挠脩裘艽a使用Base64模式進行加密。如果用戶名是 "admin" ,密碼是“ admin”,則將字符串"admin:admin"使用Base64編碼算法加密。加密結(jié)果可能是:YWtaW46YWRtaW4=。
然后,在Http請求中使用authorization作為一個HTTP請求頭Header name,“Basic YWtaW46YWRtaW4=“作為Header的值,發(fā)送給服務端。(注意這里使用Basic+空格+加密串)
服務器在收到這樣的請求時,到達BasicAuthenticationFilter過濾器,將提取“authorization”的Header值,并使用用于驗證用戶身份的相同算法Base64進行解碼。
解碼結(jié)果與登錄驗證的用戶名密碼匹配,匹配成功則可以繼續(xù)過濾器后續(xù)的訪問。
二、HTTP Basic Auth服務端實現(xiàn)
如果你想自己搭建一個服務端,那么如何為Spring Boot 服務添加Basic Auth認證?請參考我的另外一篇文章:《Spring Security系列之Http Basic Auth登錄認證模式》 。
當然我們也可以不用自己去搭建服務端,給大家介紹一個提供免費在線的RESTful接口服務的網(wǎng)站:httpbin.com。這個網(wǎng)站為我們提供了Basic Auth認證測試服務接口。如果我們只是為了學習RestTemplate,直接用這個網(wǎng)站提供的服務就可以了。
瀏覽器訪問地址:http://www.httpbin.org/#/Auth/get_basic_auth__user___passwd_
這個接口服務是通過OpenAPI(swagger)實現(xiàn)的,所以可以進行在線的訪問測試。所以可以先通過頁面操作測試一下,再開始下面學習使用RestTemplate訪問服務端接口。
三、請求頭方式攜帶認證信息
在HTTP請求頭中攜帶Basic Auth認證的用戶名和密碼,具體實現(xiàn)參考下文代碼注釋:
@SpringBootTest class BasicAuthTests { @Resource private RestTemplate restTemplate; @Test void testBasicAuth() { //該url上攜帶用戶名密碼是httpbin網(wǎng)站測試接口的要求, //真實的業(yè)務是不需要在url上體現(xiàn)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())); //發(fā)送請求 HttpEntity<String> ans = restTemplate .exchange(url, HttpMethod.GET, //GET請求 new HttpEntity<>(null, headers), //加入headers String.class); //body響應數(shù)據(jù)接收類型 System.out.println(ans); } }
測試用例執(zhí)行成功,說明RestTemplate 正確的攜帶了Basic 認證信息,得到正常的響應結(jié)果:200。
四、攔截器方式攜帶認證信息
第三小節(jié)中的代碼雖然實現(xiàn)了功能,但是不夠好。因為每一次發(fā)送HTTP請求,我們都需要去組裝HttpHeaders 信息,這樣不好,造成大量的代碼冗余。那么有沒有一種方式可以實現(xiàn)可以一次性的為所有RestTemplate請求API添加Http Basic認證信息呢?答案就是:在RestTemplate Bean初始化的時候加入攔截器,以攔截器的方式統(tǒng)一添加Basic認證信息。
下面的代碼結(jié)合注釋去看,如果看不懂,需要去參考:
精講RestTemplate第2篇-多種底層HTTP客戶端類庫的切換
@Configuration public class ContextConfig { @Bean("OKHttp3") public RestTemplate OKHttp3RestTemplate(){ RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); //添加攔截器 restTemplate.getInterceptors().add(getCustomInterceptor()); return restTemplate; } //實現(xiàn)一個攔截器:使用攔截器為每一個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節(jié)-底層HTTP客戶端實現(xiàn)切換》的內(nèi)容 private ClientHttpRequestFactory getClientHttpRequestFactory() { int timeout = 100000; OkHttp3ClientHttpRequestFactory clientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory(); clientHttpRequestFactory.setConnectTimeout(timeout); return clientHttpRequestFactory; } }
在RestTemplate Bean初始化的時候加入攔截器之后,第三小節(jié)中的代碼就可以省略HttpHeaders Basic Auth請求頭攜帶信息的組裝過程。發(fā)送請求,結(jié)果和第三小節(jié)中的效果是一樣的。
五、進一步簡化
上面的方式使用了攔截器,但仍然是我們自己來封裝HTTP headers請求頭信息。進一步的簡化方法就是,Spring RestTemplate 已經(jīng)為我們提供了封裝好的Basic Auth攔截器,我們直接使用就可以了,不需要我們自己去實現(xiàn)攔截器。
下面的方法是在RestTemplate Bean實例化的時候使用RestTemplateBuilder,自帶basicAuthentication。所以到這里攔截器也不需要了(實際底層代碼實現(xiàn)仍然是攔截器,只是api層面不需要指定攔截器了)。
發(fā)送請求,結(jié)果和第三小節(jié)中的效果是一樣的。
以上就是RestTemplate如何通過HTTP Basic Auth認證示例說明的詳細內(nèi)容,更多關于RestTemplate認證HTTP Basic Auth的資料請關注腳本之家其它相關文章!
相關文章
解決IDEA中Maven依賴包導入失敗報紅問題(總結(jié)最有效8種解決方案)
這篇文章主要介紹了解決IDEA中Maven依賴包導入失敗報紅問題,本文通過圖文詳解給大家總結(jié)了最有效的8種解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Java 獲取Html文本中的img標簽下src中的內(nèi)容方法
今天小編就為大家分享一篇Java 獲取Html文本中的img標簽下src中的內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06springboot整合apache ftpserver詳細教程(推薦)
這篇文章主要介紹了springboot整合apache ftpserver詳細教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01Mybatis分頁的實現(xiàn)及使用注解開發(fā)操作
這篇文章主要介紹了Mybatis分頁的實現(xiàn)及使用注解開發(fā)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06