OAuth2的理解

1.何謂OAuth2:

OAuth 是一個開放標(biāo)準(zhǔn)秉氧,該標(biāo)準(zhǔn)允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲的私密資源(如頭像床三、照片仿滔、視頻等),而在這個過程中無需將用戶名和密碼提供給第三方應(yīng)用郑临。實(shí)現(xiàn)這一功能是通過提供一個令牌(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)證都能解決。例如 QQ 授權(quán)登錄懦傍、微信授權(quán)登錄雹舀、微博授權(quán)登錄、GitHub 這種第三方授權(quán)登錄等等都是利用OAuth2 來解決粗俱。

簡單來說OAuth 就是一種授權(quán)機(jī)制说榆。數(shù)據(jù)的所有者告訴系統(tǒng),同意授權(quán)第三方應(yīng)用進(jìn)入系統(tǒng)寸认,獲取這些數(shù)據(jù)签财。系統(tǒng)從而產(chǎn)生一個短期的進(jìn)入令牌(token),用來代替密碼偏塞,供第三方應(yīng)用使用唱蒸。

2.OAuth2一共支持四種授權(quán)方式:

1.授權(quán)碼模式:常見的第三方平臺登錄功能基本都是使用這種模式。

2.簡化模式:簡化模式是不需要客戶端服務(wù)器參與灸叼,直接在瀏覽器中向授權(quán)服務(wù)器申請令牌(token)神汹,一般如果網(wǎng)站是純靜態(tài)頁面則可以采用這種方式。

3.密碼模式:密碼模式是用戶把用戶名密碼直接告訴客戶端古今,客戶端使用說這些信息向授權(quán)服務(wù)器申請令牌(token)屁魏。這需要用戶對客戶端高度信任,例如客戶端應(yīng)用和服務(wù)提供商就是同一家公司捉腥,我們自己做前后端分離登錄就可以采用這種模式氓拼。

4.客戶端模式:客戶端模式是指客戶端使用自己的名義而不是用戶的名義向服務(wù)提供者申請授權(quán),嚴(yán)格來說抵碟,客戶端模式并不能算作 OAuth 協(xié)議要解決的問題的一種解決方案桃漾,但是,對于開發(fā)者而言立磁,在一些前后端分離應(yīng)用或者為移動端提供的認(rèn)證授權(quán)服務(wù)器上使用這種模式還是非常方便的呈队。

2.1授權(quán)碼模式:

1.授權(quán)碼模式是最安全并且使用最廣泛的一種模式,在授權(quán)碼模式中唱歧,我們分授權(quán)服務(wù)器和資源服務(wù)器宪摧,授權(quán)服務(wù)器用來派發(fā) Token粒竖,拿著 Token 則可以去資源服務(wù)器獲取資源,這兩個服務(wù)器可以分開几于,也可以合并蕊苗。
2.舉個例子,我有一臺服務(wù)器(代表第三方服務(wù)器)沿彭,有一個用戶小明想用qq登錄 于是他點(diǎn)擊了qq登錄朽砰,然后這是我們就向qq授權(quán)服務(wù)器發(fā)起請求,路徑可能是這樣的:

https://xxx.qq.com/oauth/authorize?response_type=code&client_id=client1&redirect_uri=www.baidu.com&scope=all

這里邊有好幾個參數(shù),在后面的代碼中我們都會用到喉刘,這里先和大家簡單解釋一下:

  • response_type 表示授權(quán)類型瞧柔,使用授權(quán)碼模式的時候這里固定為 code,表示要求返回授權(quán)碼(將來拿著這個授權(quán)碼去獲取 access_token)睦裳。
  • client_id 表示客戶端 id造锅,也就是我服務(wù)器上應(yīng)用的 id。舉個栗子廉邑,如果我想讓我的 應(yīng)用程序接入微信登錄功能哥蔚,我肯定得去微信開放平臺注冊,去填入我自己應(yīng)用的基本信息等等蛛蒙,弄完之后糙箍,微信會給我一個 APPID,也就是我這里的 client_id牵祟,所以深夯,從這里可以看出,授權(quán)服務(wù)器在校驗(yàn)的時候诺苹,會做兩件事:1.校驗(yàn)客戶端的身份塌西;2.校驗(yàn)用戶身份。
  • redirect_uri 表示用戶登錄在成功/失敗后筝尾,跳轉(zhuǎn)的地址(成功登錄微信后,跳轉(zhuǎn)到哪里www.baidu.com)办桨,跳轉(zhuǎn)的時候筹淫,還會攜帶上一個授權(quán)碼參數(shù)。
  • scope 表示授權(quán)范圍呢撞,即 www.baidu.com 這個網(wǎng)站拿著用戶的 token 都能干啥(一般來說就是獲取用戶非敏感的基本信息)损姜。

3.接下來第四步,我的應(yīng)用拿著第三步獲取到的 code 以及自己的 client_id 和 client_secret 以及其他一些信息去授權(quán)服務(wù)器請求令牌殊霞,qq的授權(quán)服務(wù)器在校驗(yàn)過這些數(shù)據(jù)之后摧阅,就會發(fā)送一個令牌回來。這個過程一般是在后端完成的绷蹲,而不是利用 js 去完成棒卷。
4.接下來拿著這個 token顾孽,我們就可以去請求用戶信息了。
一般情況下我們認(rèn)為授權(quán)碼模式是四種模式中最安全的一種模式比规,因?yàn)檫@種模式我們的 access_token 不用經(jīng)過瀏覽器或者移動端 App若厚,是直接從我們的后臺發(fā)送到授權(quán)服務(wù)器上,這樣就很大程度減少了 access_token 泄漏的風(fēng)險蜒什。

2.2 簡化模式

1.我的服務(wù)器测秸,即第三方服務(wù),要請求qq的登錄授權(quán)

https://wx.qq.com/oauth/authorize?response_type=token&client_id=client1&redirect_uri=www.baidu.com&scope=all

這里的參數(shù)和前面授權(quán)碼模式的基本相同灾常,只有 response_type 的值不一樣霎冯,這里是 token,表示要求授權(quán)服務(wù)器直接返回 access_token钞瀑。
2.點(diǎn)擊這個連接之后可能會跳到qq或者微信登錄界面沈撞。
3.用戶登錄成功之后授權(quán)服務(wù)器會重定向到指定網(wǎng)址,同時攜帶上access_token仔戈。
這種做法很不安全关串,因?yàn)闆]有經(jīng)過后臺處理,請求路徑暴露在外监徘,除非對安全性要求不高晋修,否則不建議使用。

2.3密碼模式

1.密碼模式有一個前提就是你高度信任第三方應(yīng)用凰盔,舉個不恰當(dāng)?shù)睦樱喝绻乙?www.baidu.com 這個網(wǎng)站上接入微信登錄墓卦,我使用了密碼模式,那你就要在 www.baidu.com 這個網(wǎng)站去輸入微信的用戶名密碼户敬,這肯定是不靠譜的落剪,所以密碼模式需要你非常信任第三方應(yīng)用。微服務(wù)中有一個特殊的場景尿庐,就是服務(wù)之間的調(diào)用忠怖,用密碼模式做鑒權(quán)是非常恰當(dāng)不過的了。
2.仍舊是這個地址

 https://wx.qq.com/oauth/authorize?response_type=password&client_id=client1&username=aiya&password=xxxx

這里的參數(shù)和前面授權(quán)碼模式的略有差異抄瑟,response_type 的值不一樣凡泣,這里是 password,表示密碼式皮假,另外多了用戶名/密碼參數(shù)鞋拟,沒有重定向的 redirect_uri ,因?yàn)檫@里不需要重定向惹资。
3.微信校驗(yàn)過用戶名/密碼之后贺纲,直接在 HTTP 響應(yīng)中把 access_token 返回給客戶端。

2.4客戶端模式

1.請求地址:

 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&client_id=APPID&client_secret=APPSECRET

這里有三個參數(shù)褪测,含義如下:

  • grant_type猴誊,獲取access_token填寫client_credential
  • client_id 和 client_secret 用來確認(rèn)客戶端的身份
    2.授權(quán)服務(wù)器通過驗(yàn)證后潦刃,會直接返回 access_token 給客戶端。只針對客戶端稠肘,不針對用戶福铅。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市项阴,隨后出現(xiàn)的幾起案子滑黔,更是在濱河造成了極大的恐慌,老刑警劉巖环揽,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件略荡,死亡現(xiàn)場離奇詭異,居然都是意外死亡歉胶,警方通過查閱死者的電腦和手機(jī)汛兜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來通今,“玉大人粥谬,你說我怎么就攤上這事”杷” “怎么了漏策?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臼氨。 經(jīng)常有香客問我掺喻,道長,這世上最難降的妖魔是什么储矩? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任感耙,我火速辦了婚禮,結(jié)果婚禮上持隧,老公的妹妹穿的比我還像新娘即硼。我一直安慰自己,他們只是感情好屡拨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布谦絮。 她就那樣靜靜地躺著,像睡著了一般洁仗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上性锭,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天赠潦,我揣著相機(jī)與錄音,去河邊找鬼草冈。 笑死她奥,一個胖子當(dāng)著我的面吹牛瓮增,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哩俭,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼绷跑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凡资?” 一聲冷哼從身側(cè)響起砸捏,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隙赁,沒想到半個月后垦藏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伞访,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年掂骏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厚掷。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡弟灼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冒黑,到底是詐尸還是另有隱情田绑,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布薛闪,位于F島的核電站辛馆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豁延。R本人自食惡果不足惜昙篙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诱咏。 院中可真熱鬧苔可,春花似錦、人聲如沸袋狞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苟鸯。三九已至同蜻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間早处,已是汗流浹背湾蔓。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砌梆,地道東北人默责。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓贬循,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桃序。 傳聞我的和親對象是個殘疾皇子杖虾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359