OAuth2 and Spring Security

OAuth2和Spring Security(請(qǐng)選擇以下列出的主題并嘗試枚赡,越好越好)

1.了解OAuth2概念和支持的授權(quán)類型流程御滩。 并研究如何根據(jù)客戶類型以及是否涉及用戶選擇授予類型。 (推薦的)

參考學(xué)習(xí)文章:理解OAuth 2.0-阮一峰
專有名詞

  (1) Third-party application:第三方應(yīng)用程序臣嚣,本文中又稱"客戶端"(client)搓逾,即上一節(jié)例子中的"云沖印"笋鄙。

(2)HTTP service:HTTP服務(wù)提供商,本文中簡(jiǎn)稱"服務(wù)提供商"互拾,即上一節(jié)例子中的Google歪今。

(3)Resource Owner:資源所有者,本文中又稱"用戶"(user)颜矿。

(4)User Agent:用戶代理寄猩,本文中就是指瀏覽器。

(5)Authorization server:認(rèn)證服務(wù)器骑疆,即服務(wù)提供商專門用來處理認(rèn)證的服務(wù)器田篇。

(6)Resource server:資源服務(wù)器,即服務(wù)提供商存放用戶生成的資源的服務(wù)器箍铭。它與認(rèn)證服務(wù)器泊柬,可以是同一臺(tái)服務(wù)器,也可以是不同的服務(wù)器诈火。

OAuth的作用就是讓"客戶端"安全可控地獲取"用戶"的授權(quán)兽赁,與"服務(wù)商提供商"進(jìn)行互動(dòng)。


image.png

OAuth在"客戶端"與"服務(wù)提供商"之間冷守,設(shè)置了一個(gè)授權(quán)層(authorization layer)刀崖。"客戶端"不能直接登錄"服務(wù)提供商",只能登錄授權(quán)層拍摇,以此將用戶與客戶端區(qū)分開來亮钦。"客戶端"登錄授權(quán)層所用的令牌(token),與用戶的密碼不同充活。用戶可以在登錄的時(shí)候或悲,指定授權(quán)層令牌的權(quán)限范圍和有效期。
"客戶端"登錄授權(quán)層以后堪唐,"服務(wù)提供商"根據(jù)令牌的權(quán)限范圍和有效期巡语,向"客戶端"開放用戶儲(chǔ)存的資料。

(A)用戶打開客戶端以后淮菠,客戶端要求用戶給予授權(quán)男公。

(B)用戶同意給予客戶端授權(quán)。

(C)客戶端使用上一步獲得的授權(quán),向認(rèn)證服務(wù)器申請(qǐng)令牌枢赔。

(D)認(rèn)證服務(wù)器對(duì)客戶端進(jìn)行認(rèn)證以后澄阳,確認(rèn)無(wú)誤,同意發(fā)放令牌踏拜。

(E)客戶端使用令牌碎赢,向資源服務(wù)器申請(qǐng)獲取資源。

(F)資源服務(wù)器確認(rèn)令牌無(wú)誤速梗,同意向客戶端開放資源

第三方登錄原理肮塞,流程,url 處理走向

image.png
1. A 網(wǎng)站讓用戶跳轉(zhuǎn)到 GitHub姻锁。
從頁(yè)面的link 去登錄通過github:

url:https://github.com/login/oauth/authorize?client_id=7e015d8ce32370079895&redirect_uri=http://localhost:8080/oauth/redirect
client_id告訴 GitHub 誰(shuí)在請(qǐng)求枕赵,redirect_uri是稍后跳轉(zhuǎn)回來的網(wǎng)址。
參數(shù):client_id,redirect_uri

2.GitHub 要求用戶登錄位隶,然后詢問"A 網(wǎng)站要求獲得 xx 權(quán)限拷窜,你是否同意?"

同意:GitHub 就會(huì)跳轉(zhuǎn)到redirect_uri指定的跳轉(zhuǎn)網(wǎng)址

3. 用戶同意涧黄,GitHub 就會(huì)重定向回 A 網(wǎng)站篮昧,同時(shí)發(fā)回一個(gè)授權(quán)碼。

url: http://localhost:8080/oauth/redirect?code=859310e7cecc9196f4af

4. A 網(wǎng)站使用授權(quán)碼笋妥,向 GitHub 請(qǐng)求令牌懊昨。

GitHub 返回令牌.
https://github.com/login/oauth/access_token?client_id=123456&client_secret=saaddfsddfs&code=859310e7cecc9196f4af
method:post
headers:{
accept:'application/json'
}
Response:{
access_token: fsljfjlsdfsdlslfa
}

5. A 網(wǎng)站使用令牌,向 GitHub 請(qǐng)求用戶數(shù)據(jù)挽鞠。

url:https://api.github.com/user
headers:{
accept:'application/json',
Authorization: 'token fsljfjlsdfsdlslfa'
}

OAuth四種類型:

OAuth 2.0 規(guī)定了四種獲得令牌的流程

  • 授權(quán)碼(authorization-code
    這種方式是最常用的流程疚颊,安全性也最高,它適用于那些有后端的 Web 應(yīng)用信认。授權(quán)碼通過前端傳送材义,令牌則是儲(chǔ)存在后端,而且所有與資源服務(wù)器的通信都在后端完成嫁赏。這樣的前后端分離其掂,可以避免令牌泄漏。
    https://b.com/oauth/authorize?
    response_type=code&
    client_id=CLIENT_ID&
    redirect_uri=CALLBACK_URL&
    scope=read
    image.png

    https://a.com/callback?code=AUTHORIZATION_CODE
    image.png

    https://b.com/oauth/token?
    client_id=CLIENT_ID&
    client_secret=CLIENT_SECRET&
    grant_type=authorization_code&
    code=AUTHORIZATION_CODE&
    redirect_uri=CALLBACK_URL
    image.png

{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{...}
}

image.png

  • 隱藏式(implicit)
    有些 Web 應(yīng)用是純前端應(yīng)用潦蝇,沒有后端款熬。這時(shí)就不能用上面的方式了,必須將令牌儲(chǔ)存在前端攘乒。RFC 6749 就規(guī)定了第二種方式贤牛,允許直接向前端頒發(fā)令牌。這種方式?jīng)]有授權(quán)碼這個(gè)中間步驟则酝,所以稱為(授權(quán)碼)"隱藏式"(implicit)殉簸。

https://b.com/oauth/authorize?
response_type=token&
client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&
scope=read
上面 URL 中,response_type參數(shù)為token,表示要求直接返回令牌般卑。
https://a.com/callback#token=ACCESS_TOKEN
注意武鲁,令牌的位置是 URL 錨點(diǎn)(fragment),而不是查詢字符串(querystring)蝠检,這是因?yàn)?OAuth 2.0 允許跳轉(zhuǎn)網(wǎng)址是 HTTP 協(xié)議沐鼠,因此存在"中間人攻擊"的風(fēng)險(xiǎn),而瀏覽器跳轉(zhuǎn)時(shí)叹谁,錨點(diǎn)不會(huì)發(fā)到服務(wù)器饲梭,就減少了泄漏令牌的風(fēng)險(xiǎn)。
這種方式把令牌直接傳給前端本慕,是很不安全的排拷。因此侧漓,只能用于一些安全要求不高的場(chǎng)景锅尘,并且令牌的有效期必須非常短,通常就是會(huì)話期間(session)有效布蔗,瀏覽器關(guān)掉藤违,令牌就失效了。

  • 密碼式(password)
  1. 第一步纵揍,A 網(wǎng)站要求用戶提供 B 網(wǎng)站的用戶名和密碼顿乒。拿到以后,A 就直接向 B 請(qǐng)求令牌泽谨。
https://oauth.b.com/token?
  grant_type=password&
  username=USERNAME&
  password=PASSWORD&
  client_id=CLIENT_ID

上面 URL 中璧榄,grant_type參數(shù)是授權(quán)方式,這里的password表示"密碼式"吧雹,username和password是 B 的用戶名和密碼骨杂。

  1. 第二步,B 網(wǎng)站驗(yàn)證身份通過后雄卷,直接給出令牌搓蚪。注意,這時(shí)不需要跳轉(zhuǎn)丁鹉,而是把令牌放在 JSON 數(shù)據(jù)里面妒潭,作為 HTTP 回應(yīng),A 因此拿到令牌
    用戶給出自己的用戶名/密碼揣钦,顯然風(fēng)險(xiǎn)很大雳灾,因此只適用于其他授權(quán)方式都無(wú)法采用的情況,
  • 客戶端憑證(client credentials)
    最后一種方式是憑證式(client credentials)冯凹,適用于沒有前端的命令行應(yīng)用谎亩,即在命令行下請(qǐng)求令牌。
  1. 第一步,A 應(yīng)用在命令行向 B 發(fā)出請(qǐng)求团驱。
https://oauth.b.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET
  1. 第二步摸吠,B 網(wǎng)站驗(yàn)證通過以后,直接返回令牌嚎花。
    這種方式給出的令牌寸痢,是針對(duì)第三方應(yīng)用的,而不是針對(duì)用戶的紊选,即有可能多個(gè)用戶共享同一個(gè)令牌啼止。
    更新令牌
    令牌的有效期到了,如果讓用戶重新走一遍上面的流程兵罢,再申請(qǐng)一個(gè)新的令牌献烦,很可能體驗(yàn)不好,而且也沒有必要卖词。OAuth 2.0 允許用戶自動(dòng)更新令牌巩那。

具體方法是,B 網(wǎng)站頒發(fā)令牌的時(shí)候此蜈,一次性頒發(fā)兩個(gè)令牌即横,一個(gè)用于獲取數(shù)據(jù),另一個(gè)用于獲取新的令牌(refresh token 字段)裆赵。令牌到期前东囚,用戶使用 refresh token 發(fā)一個(gè)請(qǐng)求,去更新令牌战授。

https://b.com/oauth/token?
  grant_type=refresh_token&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET&
  refresh_token=REFRESH_TOKEN

上面 URL 中页藻,grant_type參數(shù)為refresh_token表示要求更新令牌,client_id參數(shù)和client_secret參數(shù)用于確認(rèn)身份植兰,refresh_token參數(shù)就是用于更新令牌的令牌份帐。
B 網(wǎng)站驗(yàn)證通過以后,就會(huì)頒發(fā)新的令牌钉跷。

2.了解為什么不再建議授予類型“隱式代碼”弥鹦。 (推薦的)
3.使用openid(例如GitHub)或Spring安全授權(quán)服務(wù)器構(gòu)建Spring安全演示(包括客戶端和資源服務(wù)器)。 (推薦的)
4.使用啟用了Spring安全性的資源服務(wù)器構(gòu)建Vue.js客戶端(僅基于瀏覽器)(推薦)
5.構(gòu)建包括客戶端爷辙,網(wǎng)關(guān)彬坏,資源服務(wù)器在內(nèi)的Spring安全演示,并在網(wǎng)關(guān)中進(jìn)行身份驗(yàn)證(可選)膝晾。
6.用UAA服務(wù)器構(gòu)建Spring安全演示(包括客戶端和資源服務(wù)器)栓始。 您可以參考:
?PCF uaa示例應(yīng)用程序:https://github.com/pivotal-cf/identity-sample-apps
?UAA服務(wù)器https://docs.run.pivotal.io/concepts/architecture/uaa.html(可選)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市血当,隨后出現(xiàn)的幾起案子幻赚,更是在濱河造成了極大的恐慌禀忆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件落恼,死亡現(xiàn)場(chǎng)離奇詭異箩退,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)佳谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門戴涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钻蔑,你說我怎么就攤上這事啥刻。” “怎么了咪笑?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵可帽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我窗怒,道長(zhǎng)映跟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任兜粘,我火速辦了婚禮申窘,結(jié)果婚禮上弯蚜,老公的妹妹穿的比我還像新娘孔轴。我一直安慰自己,他們只是感情好碎捺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布路鹰。 她就那樣靜靜地躺著,像睡著了一般收厨。 火紅的嫁衣襯著肌膚如雪晋柱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天诵叁,我揣著相機(jī)與錄音雁竞,去河邊找鬼。 笑死拧额,一個(gè)胖子當(dāng)著我的面吹牛碑诉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侥锦,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼进栽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了恭垦?” 一聲冷哼從身側(cè)響起快毛,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤格嗅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后唠帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屯掖,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年襟衰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂扼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡右蒲,死狀恐怖阀湿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑰妄,我是刑警寧澤陷嘴,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站间坐,受9級(jí)特大地震影響灾挨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竹宋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一劳澄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜈七,春花似錦秒拔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至三娩,卻和暖如春庵芭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雀监。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工双吆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人会前。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓好乐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親回官。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曹宴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • OAuth是一個(gè)關(guān)于授權(quán)(authorization)的開放網(wǎng)絡(luò)標(biāo)準(zhǔn),在全世界得到廣泛應(yīng)用歉提,目前的版本是2.0...
    上善若水任意云閱讀 2,187評(píng)論 0 4
  • 前言: 我也不知道這個(gè)前言怎么寫笛坦,反正我就是要加区转。 我為什么要寫這篇文章?前些天調(diào)用一個(gè)普通的搜索...
    機(jī)智的老劉明同志閱讀 559評(píng)論 1 1
  • Introduction OAuth(Open Auth版扩,開放授權(quán) ) 就是一種授權(quán)機(jī)制废离。數(shù)據(jù)的所有者告訴系統(tǒng),同...
    白色十字閱讀 281評(píng)論 0 0
  • OAuth2.0協(xié)議 定義 OAuth: OAuth(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn)礁芦,允許用戶授權(quán)第三方移動(dòng)應(yīng)用訪問他們...
    HoooChan閱讀 5,390評(píng)論 1 3
  • 轉(zhuǎn)載:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html ...
    我是一個(gè)人在戰(zhàn)斗閱讀 193評(píng)論 0 0