OAuth2.0系列之基本概念和運(yùn)作流程(一)

@TOC

一微驶、OAuth2.0是什么涌韩?

1.1 OAuth2.0簡(jiǎn)介

OAuth 2.0是目前最流行的授權(quán)機(jī)制锚贱,用來授權(quán)第三方應(yīng)用

OAuth是一種開放協(xié)議, 允許用戶讓第三方應(yīng)用以安全且標(biāo)準(zhǔn)的方式獲取該用戶在某一網(wǎng)站甜奄,移動(dòng)或者桌面應(yīng)用上存儲(chǔ)的秘密的資源(如用戶個(gè)人信息,照片推姻,視頻平匈,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用藏古。

OAuth 1.0協(xié)議(RFC5849)作為一個(gè)指導(dǎo)性文檔發(fā)布增炭,是一個(gè)小社區(qū)的工作成果。
本標(biāo)準(zhǔn)化規(guī)范在OAuth 1.0的部署經(jīng)驗(yàn)之上構(gòu)建拧晕,也包括其他使用案例以及從更廣泛的IETF社區(qū)收集到的可擴(kuò)展性需求隙姿。

OAuth 2.0協(xié)議不向后兼容OAuth 1.0。這兩個(gè)版本可以在網(wǎng)絡(luò)上共存厂捞,實(shí)現(xiàn)者可以選擇同時(shí)支持他們输玷。

1.2 OAuth2.0官方文檔

官網(wǎng):https://oauth.net/2/ 队丝,官網(wǎng)只有英文版文檔,您也可以參考翻譯過來的文檔欲鹏,鏈接:OAuth2 RFC6749中文翻譯

OAuth2.0在安全性方面做了比較大的提高机久,簡(jiǎn)單來說OAuth2.0就是一種授權(quán)協(xié)議,可以用來授權(quán)赔嚎,隨意點(diǎn)個(gè)網(wǎng)站膘盖,如圖這種網(wǎng)站,用戶不想注冊(cè)尤误,就可以用微信侠畔、支付寶登錄,就是場(chǎng)景是很常見的损晤,也是OAuth2.0的應(yīng)用


在這里插入圖片描述

二践图、OAuth2.0原理

OAuth2.0是一種授權(quán)機(jī)制,正常情況沉馆,不使用OAuth2.0等授權(quán)機(jī)制的系統(tǒng),客戶端是可以直接訪問資源服務(wù)器的資源的德崭,為了用戶安全訪問數(shù)據(jù)斥黑,在訪問中間添加了Access Token機(jī)制∶汲客戶端需要攜帶Access Token去訪問受到保護(hù)的資源锌奴。所以O(shè)Auth2.0確保了資源不被惡意客戶端訪問,從而提高了系統(tǒng)的安全性憾股。

2.1 OAuth2.0流程圖

引用官方圖片介紹OAuth2.0總體流程:


在這里插入圖片描述
  • (A)客戶端向從資源所有者請(qǐng)求授權(quán)鹿蜀。
  • (B)客戶端收到授權(quán)許可,資源所有者給客戶端頒發(fā)授權(quán)許可(比如授權(quán)碼code)
  • (C)客戶端與授權(quán)服務(wù)器進(jìn)行身份認(rèn)證并出示授權(quán)許可(比如授權(quán)碼code)請(qǐng)求訪問令牌服球。
  • (D)授權(quán)服務(wù)器驗(yàn)證客戶端身份并驗(yàn)證授權(quán)許可茴恰,若有效則頒發(fā)訪問令牌(accept token)。
  • (E)客戶端從資源服務(wù)器請(qǐng)求受保護(hù)資源并出示訪問令牌(accept token)進(jìn)行身份驗(yàn)證斩熊。
  • (F)資源服務(wù)器驗(yàn)證訪問令牌(accept token)往枣,若有效則滿足該請(qǐng)求。

三粉渠、 OAuth2.0的角色

OAuth2.0定義如下角色:

引用OAuth2 RFC6749中文翻譯

  • 資源所有者(Resource Owner): 能夠許可受保護(hù)資源訪問權(quán)限的實(shí)體分冈。當(dāng)資源所有者是個(gè)人時(shí),它作為最終用戶被提及霸株。
  • 用戶代理(User Agent): 指的的資源擁有者授權(quán)的一些渠道雕沉。一般指的是瀏覽器、APP
  • 客戶端(Client) 使用資源所有者的授權(quán)代表資源所有者發(fā)起對(duì)受保護(hù)資源的請(qǐng)求的應(yīng)用程序去件。術(shù)語(yǔ)“客戶端”并非特指任何特定的的實(shí)現(xiàn)特點(diǎn)(例如:應(yīng)用程序是否在服務(wù)器坡椒、臺(tái)式機(jī)或其他設(shè)備上執(zhí)行)扰路。
  • 授權(quán)服務(wù)器(Authorization Server): 在成功驗(yàn)證資源所有者且獲得授權(quán)后頒發(fā)訪問令牌給客戶端的服務(wù)器。
    授權(quán)服務(wù)器和資源服務(wù)器之間的交互超出了本規(guī)范的范圍肠牲。授權(quán)服務(wù)器可以和資源服務(wù)器是同一臺(tái)服務(wù)器幼衰,也可以是分離的個(gè)體。一個(gè)授權(quán)服務(wù)器可以頒發(fā)被多個(gè)資源服務(wù)器接受的訪問令牌缀雳。
  • 資源服務(wù)器(Resource Server): 托管受保護(hù)資源的服務(wù)器渡嚣,能夠接收和響應(yīng)使用訪問令牌對(duì)受保護(hù)資源的請(qǐng)求。

四肥印、OAuth2.0授權(quán)模式

OAuth2.0有4種授權(quán)模式:

  • 授權(quán)碼模式(authorization code)
  • 簡(jiǎn)化模式(implicit)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)

其中最常用的是授權(quán)碼模式识椰,4種授權(quán)模式的詳細(xì)介紹可以參考阮一峰老師的:OAuth 2.0 的四種方式

4.1 授權(quán)碼模式(authorization code)

授權(quán)碼(authorization code)方式,指的是第三方應(yīng)用先申請(qǐng)一個(gè)授權(quán)碼深碱,然后再用該碼獲取令牌腹鹉。

官網(wǎng)圖片:


在這里插入圖片描述

從調(diào)接口方面,簡(jiǎn)單來說:

  • 第一步:獲取code:
    eg:oauthServer+"/oauth/authorize?client_id="+clientId+"&response_type=code&redirect_uri="+redirectUrl+"&scope=all"
    如果沒有登錄敷硅,則會(huì)跳轉(zhuǎn)到統(tǒng)一身份認(rèn)證登錄頁(yè)面功咒。如果用戶登錄了,調(diào)用接口后绞蹦,會(huì)重定向到redirect_uri力奋,授權(quán)碼會(huì)作為它的參數(shù)

  • 第二步:獲取access_token
    eg:oauthServer+"/oauth/token?code="+code+"&grant_type=authorization_code&client_secret="+clientSecret+"&redirect_uri="+redirectUri+"&client_id="+clientId

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODk1MzQ5NzMsInVzZXJfbmFtZSI6Im5pY2t5IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9hZG1pbiJdLCJqdGkiOiJmMjM0M2Q0NC1hODViLTQyOGYtOWE1ZS1iNTE4NTAwNTM5ODgiLCJjbGllbnRfaWQiOiJvYSIsInNjb3BlIjpbImFsbCJdfQ.LWkN2gC2dBrGTn5uSPzfdW6yRj7jhlX87EE8scY02hI",
    "token_type": "bearer",
    "expires_in": 59,
    "scope": "all",
    "user_name": "nicky",
    "jti": "f2343d44-a85b-428f-9a5e-b51850053988"
}
  • 第三步:訪問系統(tǒng)資源,此時(shí)統(tǒng)一認(rèn)證服務(wù)會(huì)根據(jù)該認(rèn)證客戶端權(quán)限信息判斷幽七,決定是否返回信息景殷。

訪問:http://localhost:8084/api/userinfo?access_token=${accept_token}

4.2 簡(jiǎn)化模式(implicit grant type)

簡(jiǎn)化模式(implicit grant type)不通過第三方應(yīng)用程序的服務(wù)器,直接在瀏覽器中向認(rèn)證服務(wù)器申請(qǐng)令牌澡屡,跳過了"授權(quán)碼"這個(gè)步驟猿挚,因此稱簡(jiǎn)化模式

在這里插入圖片描述

從調(diào)接口方面,簡(jiǎn)單來說:

  • 第一步:訪問授權(quán)驶鹉,要傳client_id:客戶端id绩蜻,redirect_uri:重定向uri,response_type為token梁厉,scope是授權(quán)范圍辜羊,state是其它自定義參數(shù)

http://localhost:8888/oauth/authorize?client_id=cms&redirect_uri=http://localhost:8084/callback&response_type=token&scope=read&state=123

  • 第二步:授權(quán)通過,會(huì)重定向到redirect_uri词顾,access_token碼會(huì)作為它的參數(shù)

http://localhost:8084/callback#access_token=${accept_token}&token_type=bearer&state=123&expires_in=120

  • 第三步:拿到acceptToken之后八秃,就可以直接訪問資源

http://localhost:8084/api/userinfo?access_token=${accept_token}

4.3 密碼模式(resource owner password credentials)

密碼模式中,用戶向客戶端提供自己的用戶名和密碼肉盹,這通常用在用戶對(duì)客戶端高度信任的情況

在這里插入圖片描述

從調(diào)接口方面昔驱,簡(jiǎn)單來說:

  • 第一步:直接傳username,password獲取token

http://localhost:8888/oauth/token?client_id=cms&client_secret=secret&username=admin&password=123456&grant_type=password&scope=all

  • 第二步:拿到acceptToken之后上忍,就可以直接訪問資源

http://localhost:8084/api/userinfo?access_token=${accept_token}

4.4 客戶端模式(client credentials)

客戶端模式(client credentials)適用于沒有前端的命令行應(yīng)用骤肛,即在命令行下請(qǐng)求令牌

在這里插入圖片描述

從調(diào)接口方面纳本,簡(jiǎn)單來說:

  • 第二步:拿到acceptToken之后,就可以直接訪問資源

http://localhost:8084/api/userinfo?access_token=${accept_token}

學(xué)習(xí)必要的理論知識(shí)后腋颠,還是實(shí)踐一下才能明白整個(gè)流程繁成,詳情參考我OAuth2.0系列博客專欄:OAuth2.0系列博客,SpringBoot的參考我系列博客專欄:SpringBoot系列博客

五淑玫、優(yōu)質(zhì)參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巾腕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子絮蒿,更是在濱河造成了極大的恐慌尊搬,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件土涝,死亡現(xiàn)場(chǎng)離奇詭異佛寿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)但壮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門冀泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜡饵,你說我怎么就攤上這事腔长。” “怎么了验残?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)巾乳。 經(jīng)常有香客問我您没,道長(zhǎng),這世上最難降的妖魔是什么胆绊? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任氨鹏,我火速辦了婚禮,結(jié)果婚禮上压状,老公的妹妹穿的比我還像新娘仆抵。我一直安慰自己,他們只是感情好种冬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布镣丑。 她就那樣靜靜地躺著,像睡著了一般娱两。 火紅的嫁衣襯著肌膚如雪莺匠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天十兢,我揣著相機(jī)與錄音趣竣,去河邊找鬼摇庙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遥缕,可吹牛的內(nèi)容都是我干的卫袒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼单匣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼夕凝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起封孙,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迹冤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后虎忌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泡徙,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年膜蠢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堪藐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挑围,死狀恐怖礁竞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杉辙,我是刑警寧澤模捂,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蜘矢,受9級(jí)特大地震影響狂男,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜品腹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一岖食、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舞吭,春花似錦泡垃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惧浴,卻和暖如春澎剥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工哑姚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祭饭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓叙量,卻偏偏與公主長(zhǎng)得像倡蝙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绞佩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354