<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文是精講RestTemplate第9篇,前篇的blog存取地址如下:
RestTemplate在Spring或非Spring環境下使用精講
RestTemplate實現多種底層HTTP使用者端類庫的切換用法
RestTemplate傳送HTTP GET請求使用方法詳解
RestTemplate傳送HTTP POST請求使用方法詳解
RestTemplate的DELETE及PUT等請求方法使用精講
服務提供方通常會通過一定的授權、鑑權認證邏輯來保護API介面。其中比較簡單、容易實現的方式就是使用HTTP 的Basic Auth來實現介面存取使用者的認證。我們本節就來為大家介紹一下,在伺服器端加入Basic Auth認證的情況下,該如何使用RestTemplate存取伺服器端介面。
首先,HttpBasic模式要求傳輸的使用者名稱密碼使用Base64模式進行加密。如果使用者名稱是 "admin" ,密碼是“ admin”,則將字串"admin:admin"使用Base64編碼演演算法加密。加密結果可能是:YWtaW46YWRtaW4=。
然後,在Http請求中使用authorization作為一個HTTP請求頭Header name,“Basic YWtaW46YWRtaW4=“作為Header的值,傳送給伺服器端。(注意這裡使用Basic+空格+加密串)
伺服器在收到這樣的請求時,到達BasicAuthenticationFilter過濾器,將提取“authorization”的Header值,並使用用於驗證使用者身份的相同演演算法Base64進行解碼。
解碼結果與登入驗證的使用者名稱密碼匹配,匹配成功則可以繼續過濾器後續的存取。
如果你想自己搭建一個伺服器端,那麼如何為Spring Boot 服務新增Basic Auth認證?請參考我的另外一篇文章:《Spring Security系列之Http Basic Auth登入認證模式》 。
當然我們也可以不用自己去搭建伺服器端,給大家介紹一個提供免費線上的RESTful介面服務的網站:httpbin.com。這個網站為我們提供了Basic Auth認證測試服務介面。如果我們只是為了學習RestTemplate,直接用這個網站提供的服務就可以了。
瀏覽器存取地址:http://www.httpbin.org/
這個介面服務是通過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層面不需要指定攔截器了)。
傳送請求,結果和第三小節中的效果是一樣的。
以上就是RestTemplate如何通過HTTP Basic Auth認證範例說明的詳細內容,更多關於RestTemplate認證HTTP Basic Auth的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45