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 給客戶端。只針對客戶端稠肘,不針對用戶福铅。