整合spring cloud云架構 - SSO單點登錄之OAuth2.0登錄認證(1)

之前寫了很多關于spring cloud的文章,今天我們對OAuth2.0的整合方式做一下筆記抛蚁,首先我從網(wǎng)上找了一些關于OAuth2.0的一些基礎知識點,幫助大家回顧一下知識點:

一磷支、oauth中的角色

client:調(diào)用資源服務器API的應用

Oauth 2.0 Provider:包括Authorization Server和Resource Server

(1)Authorization Server:認證服務器毫别,進行認證和授權

(2)Resource Server:資源服務器,保護受保護的資源

user:資源的擁有者

二辟汰、下面詳細介紹一下Oauth 2.0 Provider

Authorization Server:

(1)AuthorizationEndpoint:進行授權的服務列敲,Default URL:?/oauth/authorize

(2)TokenEndpoint:獲取token的服務阱佛,Default URL:?/oauth/token?

Resource Server:

OAuth2AuthenticationProcessingFilter:給帶有訪問令牌的請求加載認證

三、下面再來詳細介紹一下Authorization Server:

一般情況下戴而,創(chuàng)建兩個配置類凑术,一個繼承AuthorizationServerConfigurerAdapter,一個繼承WebSecurityConfigurerAdapter所意,再去復寫里面的方法淮逊。

主要出現(xiàn)的兩種注解:

1、@EnableAuthorizationServer:聲明一個認證服務器扶踊,當用此注解后泄鹏,應用啟動后將自動生成幾個Endpoint:(注:其實實現(xiàn)一個認證服務器就是這么簡單,加一個注解就搞定秧耗,當然真正用到生產(chǎn)環(huán)境還是要進行一些配置和復寫工作的备籽。)

/oauth/authorize:驗證

/oauth/token:獲取token

/oauth/confirm_access:用戶授權

/oauth/error:認證失敗

/oauth/check_token:資源服務器用來校驗token

/oauth/token_key:如果jwt模式則可以用此來從認證服務器獲取公鑰

以上這些endpoint都在源碼里的endpoint包里面。

2绣版、@Beans:需要實現(xiàn)AuthorizationServerConfigurer

AuthorizationServerConfigurer包含三種配置:

ClientDetailsServiceConfigurer:client客戶端的信息配置,client信息包括:clientId歼疮、secret杂抽、scope、authorizedGrantTypes韩脏、authorities

(1)scope:表示權限范圍缩麸,可選項,用戶授權頁面時進行選擇

(2)authorizedGrantTypes:有四種授權方式?

Authorization Code:用驗證獲取code赡矢,再用code去獲取token(用的最多的方式杭朱,也是最安全的方式)

Implicit: 隱式授權模式

Client Credentials (用來取得 App Access Token)

Resource Owner Password Credentials

(3)authorities:授予client的權限

這里的具體實現(xiàn)有多種,in-memory吹散、JdbcClientDetailsService弧械、jwt等。

AuthorizationServerSecurityConfigurer:聲明安全約束空民,哪些允許訪問刃唐,哪些不允許訪問

AuthorizationServerEndpointsConfigurer:聲明授權和token的端點以及token的服務的一些配置信息,比如采用什么存儲方式界轩、token的有效期等

client的信息的讀然ⅰ:在ClientDetailsServiceConfigurer類里面進行配置,可以有in-memory浊猾、jdbc等多種讀取方式抖甘。

jdbc需要調(diào)用JdbcClientDetailsService類,此類需要傳入相應的DataSource.

下面再介紹一下如何管理token:

AuthorizationServerTokenServices接口:聲明必要的關于token的操作

(1)當token創(chuàng)建后葫慎,保存起來衔彻,以便之后的接受訪問令牌的資源可以引用它薇宠。

(2)訪問令牌用來加載認證

接口的實現(xiàn)也有多種,DefaultTokenServices是其默認實現(xiàn)米奸,他使用了默認的InMemoryTokenStore昼接,不會持久化token;

token存儲方式共有三種分別是:

(1)InMemoryTokenStore:存放內(nèi)存中悴晰,不會持久化

(2)JdbcTokenStore:存放數(shù)據(jù)庫中

(3)Jwt: json web token

授權類型:

可以通過AuthorizationServerEndpointsConfigurer來進行配置慢睡,默認情況下,支持除了密碼外的所有授權類型铡溪。相關授權類型的一些類:

(1)authenticationManager:直接注入一個AuthenticationManager漂辐,自動開啟密碼授權類型

(2)userDetailsService:如果注入UserDetailsService,那么將會啟動刷新token授權類型棕硫,會判斷用戶是否還是存活的

(3)authorizationCodeServices:AuthorizationCodeServices的實例髓涯,auth code 授權類型的服務

(4)implicitGrantService:imlpicit grant

(5)tokenGranter:

endpoint的URL的配置:

(1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有兩個參數(shù)哈扮,第一個是默認的URL路徑纬纪,第二個是自定義的路徑

(2)WebSecurityConfigurer的實例,可以配置哪些路徑不需要保護滑肉,哪些需要保護包各。默認全都保護。

自定義UI:

(1)有時候靶庙,我們可能需要自定義的登錄頁面和認證頁面问畅。登陸頁面的話,只需要創(chuàng)建一個login為前綴名的網(wǎng)頁即可六荒,在代碼里护姆,設置為允許訪問,這樣掏击,系統(tǒng)會自動執(zhí)行你的登陸頁卵皂。此登陸頁的action要注意一下,必須是跳轉(zhuǎn)到認證的地址砚亭。

(2)另外一個是授權頁渐裂,讓你勾選選項的頁面。此頁面可以參考源碼里的實現(xiàn)钠惩,自己生成一個controller的類柒凉,再創(chuàng)建一個對應的web頁面即可實現(xiàn)自定義的功能。

下面梳理一下授權獲取token流程:

(1)端口號換成你自己的認證服務器的端口號篓跛,client_id也換成你自己的膝捞,response_type類型為code。

?localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com

(2)這時候你將獲得一個code值:http://www.baidu.com/?code=G0C20Z

(3)使用此code值來獲取最終的token:

curl -X POST -H "Cant-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&code=G0C20Z&redirect_uri=http://www.baidu.com' "http://client:secret@localhost:8080/uaa/oauth/token"

返回值:

{"access_token":"b251b453-cc08-4520-9dd0-9aedf58e6ca3","token_type":"bearer","expires_in":2591324,"scope":"app"}

(4)用此token值來調(diào)用資源服務器內(nèi)容(如果資源服務器和認證服務器在同一個應用中,那么資源服務器會自己解析token值蔬咬,如果不在鲤遥,那么你要自己去做處理)

curl -H "Authorization: Bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3" "localhost:8081/service2(此處換上你自己的url)"

四、Resource Server:保護資源林艘,需要令牌才能訪問

在配置類上加上注解@EnableResourceServer即啟動盖奈。使用ResourceServerConfigurer進行配置:

(1)tokenServices:ResourceServerTokenServices的實例,聲明了token的服務

(2)resourceId:資源Id狐援,由auth Server驗證钢坦。

(3)其它一些擴展點,比如可以從請求中提取token的tokenExtractor

(4)一些自定義的資源保護配置啥酱,通過HttpSecurity來設置

使用token的方式也有兩種:

(1)Bearer Token(https傳輸方式保證傳輸過程的安全):主流

(2)Mac(http+sign)

如何訪問資源服務器中的API爹凹?

如果資源服務器和授權服務器在同一個應用程序中,并且您使用DefaultTokenServices镶殷,那么您不必太考慮這一點禾酱,因為它實現(xiàn)所有必要的接口,因此它是自動一致的绘趋。如果您的資源服務器是一個單獨的應用程序颤陶,那么您必須確保您匹配授權服務器的功能,并提供知道如何正確解碼令牌的ResourceServerTokenServices陷遮。與授權服務器一樣滓走,您可以經(jīng)常使用DefaultTokenServices,并且選項大多通過TokenStore(后端存儲或本地編碼)表示拷呆。

(1)在校驗request中的token時闲坎,使用RemoteTokenServices去調(diào)用AuthServer中的/auth/check_token疫粥。

(2)共享數(shù)據(jù)庫茬斧,使用Jdbc存儲和校驗token,避免再去訪問AuthServer梗逮。

(3)使用JWT簽名的方式项秉,資源服務器自己直接進行校驗,不借助任何中間媒介慷彤。

五娄蔼、oauth client

在客戶端獲取到token之后,想去調(diào)用下游服務API時底哗,為了能將token進行傳遞岁诉,可以使用RestTemplate.然后使用restTemplate進行調(diào)用Api。

注:

scopes和authorities的區(qū)別:

scopes是client權限跋选,至少授予一個scope的權限涕癣,否則報錯。

authorities是用戶權限前标。??(企業(yè)架構源碼可以加求球:3536247259)

以上是我從網(wǎng)上找到的一篇寫的不錯的博客坠韩,希望可以幫助大家快速了解OAuth2.0,下一篇文章我們正式介紹OAuth2.0在當前框架中的使用距潘。

從現(xiàn)在開始,我這邊會將近期研發(fā)的spring cloud微服務云架構的搭建過程和精髓記錄下來只搁,幫助更多有興趣研發(fā)spring cloud框架的朋友音比,大家來一起探討spring cloud架構的搭建過程及如何運用于企業(yè)項目。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氢惋,一起剝皮案震驚了整個濱河市洞翩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌明肮,老刑警劉巖菱农,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柿估,居然都是意外死亡循未,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門秫舌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來的妖,“玉大人,你說我怎么就攤上這事足陨∩┧冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵墨缘,是天一觀的道長星虹。 經(jīng)常有香客問我,道長镊讼,這世上最難降的妖魔是什么宽涌? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蝶棋,結果婚禮上卸亮,老公的妹妹穿的比我還像新娘。我一直安慰自己玩裙,他們只是感情好兼贸,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吃溅,像睡著了一般溶诞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上决侈,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天螺垢,我揣著相機與錄音,去河邊找鬼。 笑死甩苛,一個胖子當著我的面吹牛蹂楣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讯蒲,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼痊土,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了墨林?” 一聲冷哼從身側(cè)響起赁酝,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旭等,沒想到半個月后酌呆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡搔耕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年隙袁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弃榨。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡菩收,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲸睛,到底是詐尸還是另有隱情娜饵,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布官辈,位于F島的核電站箱舞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拳亿。R本人自食惡果不足惜晴股,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望风瘦。 院中可真熱鬧队魏,春花似錦公般、人聲如沸万搔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞬雹。三九已至,卻和暖如春刽虹,著一層夾襖步出監(jiān)牢的瞬間酗捌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胖缤,地道東北人尚镰。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像哪廓,于是被迫代替她去往敵國和親狗唉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容