大家好,我是不才陳某~ 周一發(fā)了Spring Security 系列第一篇文章,有妹子留言說看了很多文章,始終沒明白OAuth2.0,這次陳某花了兩天時(shí)間,整理了OAuth2.0相關(guān)的知識,結(jié)合認(rèn)證授權(quán)服務(wù)+資源服務(wù),一次性給大家嘮明白! 這是《Spring Security 進(jìn)階》第2篇文章,往期文章如下:
本篇文章介紹一下OAuth2.0相關(guān)的知識點(diǎn),并且手把手帶大家搭建一個(gè)認(rèn)證授權(quán)中心、資源服務(wù)進(jìn)行OAuth2.0四種授權(quán)模式的驗(yàn)證,案例源碼詳細(xì),一梭子帶大家了解清楚。 本篇文章的案例源碼項(xiàng)目架構(gòu)為:Spring Boot + Spring Cloud Alibaba + Spring Security ,Spring Cloud Alibaba有不了解可以看下陳某的往期《Spring Cloud 進(jìn)階》文章:
文章目錄如下: 為什么需要OAuth2.0?編碼永遠(yuǎn)都是為了解決生產(chǎn)中的問題,想要理解為什么需要OAuth2,當(dāng)然要從實(shí)際生活出發(fā)。 舉個(gè)例子:小區(qū)的業(yè)主點(diǎn)了一份外賣,但是小區(qū)的門禁系統(tǒng)不給外賣人員進(jìn)入,此時(shí)想要外賣員進(jìn)入只能業(yè)主下來開門或者告知門禁的密碼。 密碼告知外賣員豈不是每次都能憑密碼進(jìn)入小區(qū)了,這明顯造成了安全隱患。 那么有沒有一種方案:既能不泄露密碼,也能讓外賣小哥進(jìn)入呢? 于是此時(shí)就想到了一個(gè)授權(quán)機(jī)制,分為以下幾個(gè)步驟:
另外這個(gè)授權(quán)的密碼不僅可以通過門禁,還可以通過樓下的門禁,這就非常類似于網(wǎng)關(guān)和微服務(wù)了。 令牌和密碼的區(qū)別?上述例子中令牌和密碼的作用是一樣的,都可以進(jìn)入小區(qū),但是存在以下幾點(diǎn)差異:
什么是OAuth2?OAuth 是一個(gè)開放標(biāo)準(zhǔn),該標(biāo)準(zhǔn)允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲的私密資源(如頭像、照片、視頻等),而在這個(gè)過程中無需將用戶名和密碼提供給第三方應(yīng)用。實(shí)現(xiàn)這一功能是通過提供一個(gè)令牌(token),而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。 采用令牌(token)的方式可以讓用戶靈活的對第三方應(yīng)用授權(quán)或者收回權(quán)限。 OAuth2 是 OAuth 協(xié)議的下一版本,但不向下兼容 OAuth 1.0。 傳統(tǒng)的 Web 開發(fā)登錄認(rèn)證一般都是基于 session 的,但是在前后端分離的架構(gòu)中繼續(xù)使用 session 就會有許多不便,因?yàn)橐苿佣耍ˋndroid、iOS、微信小程序等)要么不支持 cookie(微信小程序),要么使用非常不便,對于這些問題,使用 OAuth2 認(rèn)證都能解決。 對于大家而言,我們在互聯(lián)網(wǎng)應(yīng)用中最常見的 OAuth2 應(yīng)該就是各種第三方登錄了,例如 QQ 授權(quán)登錄、微信授權(quán)登錄、微博授權(quán)登錄、GitHub 授權(quán)登錄等等。 OAuth2.0的四種模式?OAuth2.0協(xié)議一共支持 4 種不同的授權(quán)模式:
1、授權(quán)碼模式這種方式是最常用的流程,安全性也最高,它適用于那些有后端的 Web 應(yīng)用。授權(quán)碼通過前端傳送,令牌則是儲存在后端,而且所有與資源服務(wù)器的通信都在后端完成。這樣的前后端分離,可以避免令牌泄漏。 令牌獲取的流程如下: 上圖中涉及到兩個(gè)角色,分別是客戶端、認(rèn)證中心,客戶端負(fù)責(zé)拿令牌,認(rèn)證中心負(fù)責(zé)發(fā)放令牌。 但是不是所有客戶端都有權(quán)限請求令牌的,需要事先在認(rèn)證中心申請,比如微信并不是所有網(wǎng)站都能直接接入,而是要去微信后臺開通這個(gè)權(quán)限。 至少要提前向認(rèn)證中心申請的幾個(gè)參數(shù)如下:
1、請求授權(quán)碼 客戶端需要向認(rèn)證中心拿到授權(quán)碼,比如第三方登錄使用微信,掃一掃登錄那一步就是向微信的認(rèn)證中心獲取授權(quán)碼。 請求的url如下:
上述這個(gè)url中攜帶的幾個(gè)參數(shù)如下:
2、返回授權(quán)碼 第1步請求之后,認(rèn)證中心會要求登錄、是否同意授權(quán),用戶同意授權(quán)之后直接跳轉(zhuǎn)到
上述鏈接中的 3、請求令牌 客戶端拿到授權(quán)碼之后,直接攜帶授權(quán)碼發(fā)送請求給認(rèn)證中心獲取令牌,請求的url如下:
相同的參數(shù)同上,不同參數(shù)解析如下:
4、返回令牌 認(rèn)證中心收到令牌請求之后,通過之后,會返回一段JSON數(shù)據(jù),其中包含了令牌access_token,如下:
access_token則是頒發(fā)的令牌,refresh_token是刷新令牌,一旦令牌失效則攜帶這個(gè)令牌進(jìn)行刷新。 2、簡化模式這種模式不常用,主要針對那些無后臺的系統(tǒng),直接通過web跳轉(zhuǎn)授權(quán),流程如下圖: 這種方式把令牌直接傳給前端,是很不安全的。因此,只能用于一些安全要求不高的場景,并且令牌的有效期必須非常短,通常就是會話期間(session)有效,瀏覽器關(guān)掉,令牌就失效了。 1、請求令牌 客戶端直接請求令牌,請求的url如下:
這個(gè)url正是授權(quán)碼模式中獲取授權(quán)碼的url,各個(gè)參數(shù)解析如下:
2、返回令牌 認(rèn)證中心認(rèn)證通過后,會跳轉(zhuǎn)到redirect_uri,并且后面攜帶著令牌,鏈接如下:
3、密碼模式密碼模式也很簡單,直接通過用戶名、密碼獲取令牌,流程如下: 1、請求令牌 認(rèn)證中心要求客戶端輸入用戶名、密碼,認(rèn)證成功則頒發(fā)令牌,請求的url如下:
參數(shù)解析如下:
2、返回令牌 上述認(rèn)證通過,直接返回JSON數(shù)據(jù),不需要跳轉(zhuǎn),如下:
access_token則是頒發(fā)的令牌,refresh_token是刷新令牌,一旦令牌失效則攜帶這個(gè)令牌進(jìn)行刷新。 4、客戶端模式適用于沒有前端的命令行應(yīng)用,即在命令行下請求令牌。 這種方式給出的令牌,是針對第三方應(yīng)用的,而不是針對用戶的,即有可能多個(gè)用戶共享同一個(gè)令牌。 流程如下: 1、請求令牌 請求的url為如下:
參數(shù)解析如下:
2、返回令牌 認(rèn)證成功后直接返回令牌,格式為JSON數(shù)據(jù),如下:
OAuth2.0的認(rèn)證中心搭建為了方便測試OAuth2的四種授權(quán)模式,這里為了方便測試,簡單搭建一個(gè)認(rèn)證中心,后續(xù)會逐漸完善。 1、案例架構(gòu)陳某使用的是Spring Boot + Spring Cloud Alibaba 作為基礎(chǔ)搭建,新建一個(gè) “ 2、添加依賴Spring Boot 和 Spring Cloud 的相關(guān)依賴這里陳某就不再說了,直接上Spring Security和OAuth2的依賴,如下:
3、Spring Security安全配置這里主要涉及到Spring Security的配置,有不清楚的可以陳某第一篇文章:實(shí)戰(zhàn)!Spring Boot Security+JWT前后端分離架構(gòu)登錄認(rèn)證!
1、加密方式 采用BCryptPasswordEncoder加密,如下: 2、配置用戶 這里為了方便測試,直接將用戶信息存儲在內(nèi)存中,后續(xù)完善,代碼如下: 上述代碼配置了兩個(gè)用戶,如下:
3、注入認(rèn)證管理器AuthenticationManager
4、配置安全攔截策略 由于需要驗(yàn)證授權(quán)碼模式,因此開啟表單提交模式,所有url都需要認(rèn)證,代碼如下: 4、令牌存儲策略配置令牌支持多種方式存儲,比如內(nèi)存方式、Redis、JWT,比較常用的兩種則是Redis、JWT。 這里暫時(shí)使用內(nèi)存存儲的方式,一旦服務(wù)器重啟令牌將會失效。 代碼如下: 5、OAuth2.0的配置類不是所有配置類都可以作為OAuth2.0認(rèn)證中心的配置類,需要滿足以下兩點(diǎn):
代碼如下: AuthorizationServerConfigurerAdapter需要實(shí)現(xiàn)的三個(gè)方法如下: 下面便是圍繞這三個(gè)方法進(jìn)行OAuth2的詳細(xì)配置。 6、客戶端配置在介紹OAuth2.0 協(xié)議的時(shí)候介紹到,并不是所有的客戶端都有權(quán)限向認(rèn)證中心申請令牌的,首先認(rèn)證中心要知道你是誰,你有什么資格? 因此一些必要的配置是要認(rèn)證中心分配給你的,比如客戶端唯一Id、秘鑰、權(quán)限。 客戶端配置的存儲也支持多種方式,比如內(nèi)存、數(shù)據(jù)庫,對應(yīng)的接口為:org.springframework.security.oauth2.provider.ClientDetailsService,接口如下: 同樣這里為了方便測試,依然是加載在內(nèi)存中,后續(xù)完善,完整的配置如下: 幾個(gè)重要參數(shù)說一下,如下:
7、授權(quán)碼服務(wù)配置使用授權(quán)碼模式必須配置一個(gè)授權(quán)碼服務(wù),用來頒布和刪除授權(quán)碼,當(dāng)然授權(quán)碼也支持多種方式存儲,比如內(nèi)存,數(shù)據(jù)庫,這里暫時(shí)使用內(nèi)存方式存儲,代碼如下: 8、令牌服務(wù)的配置除了令牌的存儲策略需要配置,還需要配置令牌的服務(wù) 9、令牌訪問端點(diǎn)的配置目前這里僅僅配置了四個(gè),分別如下:
詳細(xì)代碼如下: spring Security框架默認(rèn)的訪問端點(diǎn)有如下6個(gè):
當(dāng)然如果業(yè)務(wù)要求需要改變這些默認(rèn)的端點(diǎn)的url,也是可以修改的,
第一個(gè)參數(shù):需要替換的默認(rèn)端點(diǎn)url 第二個(gè)參數(shù):自定義的端點(diǎn)url 10、令牌訪問安全約束配置主要對一些端點(diǎn)的權(quán)限進(jìn)行配置,代碼如下: OAuth2.0的資源服務(wù)搭建客戶端申請令牌的目的就是為了訪問資源,當(dāng)然這個(gè)資源也是分權(quán)限的,一個(gè)令牌不是所有資源都能訪問的。 在認(rèn)證中心搭建的第6步配置客戶端詳情的時(shí)候,一行代碼 1、案例架構(gòu)陳某使用的是Spring Boot + Spring Cloud Alibaba 作為基礎(chǔ)搭建,新建一個(gè) “ 2、OAuth2.0的配置類作為資源服務(wù)的配置類必須滿足兩個(gè)條件,如下:
代碼如下: 3、令牌校驗(yàn)服務(wù)配置由于認(rèn)證中心使用的令牌存儲策略是在內(nèi)存中的,因此服務(wù)端必須遠(yuǎn)程調(diào)用認(rèn)證中心的校驗(yàn)令牌端點(diǎn)**/oauth/check_token**進(jìn)行校驗(yàn)。 代碼如下: “ 4、配置客戶端唯一id和令牌校驗(yàn)服務(wù)上文說到客戶端有一個(gè)唯一標(biāo)識,因此需要配置上,代碼如下: 5、配置security的安全機(jī)制上文在認(rèn)證中心的第6步配置客戶端詳情那里,有一行代碼 攔截方式如下:
詳細(xì)配置代碼如下: 這里陳某配置了所有路徑都需要all的權(quán)限。 6、新建測試接口新建了兩個(gè)接口,如下:
OAuth2.0的四種模式測試下面結(jié)合認(rèn)證中心、資源服務(wù)對OAuth2.0的四種服務(wù)進(jìn)行測試。 啟動上述搭建的認(rèn)證中心和資源服務(wù),如下圖: 授權(quán)碼模式1、獲取授權(quán)碼 請求的url如下:
瀏覽器訪問,security需要登錄,如下: 輸入用戶名user,密碼123,成功登錄。 此時(shí)來到了確認(rèn)授權(quán)的頁面,如下: 選擇Apporove、確認(rèn)授權(quán),成功跳轉(zhuǎn)到了百度頁面,并且攜帶了授權(quán)碼,如下: 這里的6yV2bF就是獲取到的授權(quán)碼。 2、獲取token
注意:/oauth/token獲取token的接口請求允許的方式要配置在授權(quán)服務(wù)器中,比如配置POST方式,代碼如下:
POSTMAN請求如下圖: 3、訪問資源服務(wù) 拿著令牌訪問資源服務(wù)的**/hello**接口,請求如下: 請求頭需要添加Authorization,并且值為Bearer+" "+access_token的形式。 注意:Bearer后面一定要跟一個(gè)空格。 密碼模式密碼模式比較簡單,不用先獲取授權(quán)碼,直接使用用戶名、密碼獲取token。 POSTMAN請求如下: PS:訪問資源自己拿著獲取到的令牌嘗試下..... 簡化模式簡化模式就很簡單了,拿著客戶端id就可以獲取token,請求的url如下:
這個(gè)過程和獲取授權(quán)碼一樣,需要登錄,同意授權(quán) 最終跳轉(zhuǎn)到百度,鏈接后面直接攜帶了令牌,如下: 上圖中的0d5ecf06-b255-4272-b0fa-8e51dde2ce3e則是獲取的令牌。 PS:訪問資源自己嘗試下.......... 客戶端模式請求的url如下:
POSTMAN請求如下: PS:訪問資源自己嘗試下.......... OAuth2.0 其他端點(diǎn)的測試Spring Security OAuth2.0還提供了其他的端點(diǎn),下面來逐一測試一下。 1、刷新令牌OAuth2.0提供了令牌刷新機(jī)制,一旦access_token過期,客戶端可以拿著refresh_token去請求認(rèn)證中心進(jìn)行令牌的續(xù)期。 請求的url如下:
POSTMAN請求如下: 2、校驗(yàn)令牌OAuth2.0還提供了校驗(yàn)令牌的端點(diǎn),請求的url如下:
POSTMAN請求如下: 總結(jié)本文介紹了OAuth2.0協(xié)議原理、四種授權(quán)模式,并且搭建了認(rèn)證授權(quán)中心、資源服務(wù)進(jìn)行了四種模式的測試。 作為OAuth2.0入門教程已經(jīng)非常詳細(xì)了........... 最后說一句(別白嫖,求關(guān)注)陳某每一篇文章都是精心輸出,已經(jīng)寫了3個(gè)專欄,整理成PDF,獲取方式如下:
如果這篇文章對你有所幫助,或者有所啟發(fā)的話,幫忙點(diǎn)贊、在看、轉(zhuǎn)發(fā)、收藏,你的支持就是我堅(jiān)持下去的最大動力! |
|