精講RestTemplate第9篇-如何透過HTTP Basic Au
本文是精講RestTemplate第9篇,前篇的blog訪問地址如下:
服務提供方通常會透過一定的授權、鑑權認證邏輯來保護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,直接用這個網站提供的服務就可以了。
瀏覽器訪問地址: ,這個介面服務是透過OpenAPI(swagger)實現的,所以可以進行線上的訪問測試。所以可以先透過頁面操作測試一下,再開始下面學習使用RestTemplate訪問服務端介面。
三、請求頭方式攜帶認證資訊
在HTTP請求頭中攜帶Basic Auth認證的使用者名稱和密碼,具體實現參考下文程式碼註釋:
@SpringBootTest
class BasicAuthTests {
@Resource
private RestTemplate restTemplate;
@Test
void testBasicAuth() {
//該url上攜帶使用者名稱密碼是httpbin網站測試介面的要求,
//真實的業務是不需要在url上體現basic auth使用者名稱密碼的
String url = "";
//在請求頭資訊中攜帶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認證資訊。
下面的程式碼結合註釋去看,如果看不懂,需要去參考:
@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層面不需要指定攔截器了)。
傳送請求,結果和第三小節中的效果是一樣的。
歡迎關注我的部落格,裡面有很多精品合集
- 本文轉載註明出處(必須帶連線,不能只轉文字):。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2826054/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 精講RestTemplate第9篇-如何通過HTTP Basic Auth認證RESTHTTP
- 精講RestTemplate第2篇-多種底層HTTP客戶端類庫的切換RESTHTTP客戶端
- 精講RestTemplate第4篇-POST請求方法使用詳解REST
- 精講RestTemplate第3篇-GET請求使用方法詳解REST
- 精講RestTemplate第1篇-在Spring或非Spring環境下如何使用RESTSpring
- 精講RestTemplate第5篇-DELETE、PUT等請求方法使用詳解RESTdelete
- 精講RestTemplate第10篇-使用代理作為跳板傳送請求REST
- 精講RestTemplate第7篇-自定義請求失敗異常處理REST
- 精講RestTemplate第6篇-檔案上傳下載與大檔案流式下載REST
- HTTP 客戶端:RestClient、WebClient、RestTemplateHTTP客戶端RESTclientWeb
- Web services 安全 - HTTP Basic AuthenticationWebHTTP
- 怎樣透過HTTP來呼叫JMSHTTP
- 為 Eureka 新增 Http Basic 認證HTTP
- HTTP認證模式:Basic & DigestHTTP模式
- HTTP基礎認證Basic AuthenticationHTTP
- 透過瀏覽器看HTTP快取瀏覽器HTTP快取
- 使用java透過http遞交檔案?JavaHTTP
- 小書MybatisPlus第5篇-Active Record模式精講MyBatis模式
- 您可知道如何透過`HTTP2`實現TCP的內網穿透???HTTPTCP內網穿透
- Jaskson精講第6篇-自定義JsonSerialize與DeserJSON
- Synchronized 精講synchronized
- HTTP認證之基本認證——Basic(一)HTTP
- HTTP認證之基本認證——Basic(二)HTTP
- PHP介面HTTP安全認證之Basic模式PHPHTTP模式
- 透過http請求啟動jenkins任務HTTPJenkins
- 透過WebView2獲取HTTP-only cookieWebViewHTTPCookie
- 精講響應式WebClient第3篇-POST、DELETE、PUT方法使用Webclientdelete
- 如何透過華為定位API精準獲取使用者所在地理位置?API
- Mysql 索引精講MySql索引
- 一個HTTP Basic Authentication引發的異常HTTP
- reverst:透過QUIC建立HTTP反向隧道的開源工具UIHTTP開源工具
- 透過adb設定模擬器的HTTP代理HTTP
- 如何透過DBeaver 連線 TDengine?
- SAP UI5 本地開發如何透過 http-proxy 解決跨域問題UIHTTP跨域
- HTTP使用BASIC認證的原理及實現方法HTTP
- 精讀《圖解HTTP》圖解HTTP
- 透過介面拿到代理,返回代理列表(只有http,無https)HTTP
- 精講響應式WebClient第4篇-檔案上傳與下載Webclient