<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OAuth2.0從入門到出道

          共 3973字,需瀏覽 8分鐘

           ·

          2020-10-26 00:12

          什么是OAuth2

          我們都知道,很多網(wǎng)站登錄的時(shí)候,可以通過(guò)微信、QQ、微博等APP掃碼掃碼認(rèn)證登錄,其實(shí)這就是OAuth2的應(yīng)用。
          但是這里我想說(shuō)明的是oauth2是一種授權(quán)許可。它的核心本質(zhì)是用于授權(quán),獲取用戶的資源信息,而不是用于登錄。登錄是它的附加產(chǎn)物。這個(gè)細(xì)節(jié)我們一定要理解清楚,以便于后續(xù)理解整個(gè)OAuth2時(shí),不會(huì)讓自己無(wú)法理清它的核心邏輯。

          OAuth2的幾種不同的“角色”

          在這里讓我們用“掘金”這個(gè)網(wǎng)站的登錄來(lái)舉例子吧!
          1. 資源擁有者:掘金的用戶
          2. 第三方軟件:掘金(有些文章叫做客戶端)
          3. 授權(quán)服務(wù):微信開(kāi)放平臺(tái)的授權(quán)服務(wù)
          4. 受保護(hù)的資源:微信頭像、微信其他信息

          OAuth2的幾種類型

          1. 授權(quán)碼憑據(jù)許可
          2. 資源擁有者憑據(jù)許可(賬號(hào)密碼類型)
          3. 客戶端憑據(jù)許可
          4. 隱式許可(簡(jiǎn)單類型)

          授權(quán)碼憑據(jù)許可

          官方流程

          OAuth2官方流程.png
          不知道你們是什么感受,反正我看官方的圖,我覺(jué)得我理解能力有限,不知道整個(gè)流程到底是咋樣的。

          掘金登錄流程

          我們還是以掘金網(wǎng)站為案例,以下是登錄掘金的全流程:
          1. 用戶打開(kāi)掘金
          2. 用戶點(diǎn)擊登錄(微信登錄)
          3. 界面跳轉(zhuǎn)到微信掃碼頁(yè)面
          4. 用戶掃碼登錄
          5. 用戶授權(quán)并同意
          6. 登錄成功,頁(yè)面跳轉(zhuǎn)回掘金

          掘金登錄詳細(xì)流程

          以上是我們用戶能感知到的全流程,但是整個(gè)流程的服務(wù)交互,我們?nèi)匀徊恢?。下面我再以服?wù)交互的角度,更詳細(xì)描述下整個(gè)登錄流程:
          1. 用戶打開(kāi)瀏覽器,打開(kāi)掘金
          2. 用戶點(diǎn)擊登錄
          3. 頁(yè)面跳轉(zhuǎn)到微信掃碼頁(yè)面
          4. 微信授權(quán)服務(wù)校驗(yàn)掘金的請(qǐng)求信息
          5. 用戶用微信掃碼
          6. 用戶用微信授權(quán)并同意
          7. 微信授權(quán)服務(wù)校驗(yàn)用戶信息
          8. 頁(yè)面跳轉(zhuǎn)到掘金前端頁(yè)面并附帶上授權(quán)碼
          9. 掘金前端用授權(quán)碼請(qǐng)求掘金后端
          10. 掘金后端調(diào)用微信的OpenApi請(qǐng)求訪問(wèn)令牌
          11. 微信授權(quán)服務(wù)校驗(yàn)授權(quán)碼及掘金的請(qǐng)求信息,并響應(yīng)訪問(wèn)令牌
          12. 掘金后端拿到訪問(wèn)令牌,并通過(guò)訪問(wèn)令牌獲取用戶信息(用戶唯一ID、微信頭像,用戶名等)
          13. 掘金后端記錄用戶登錄
          14. 掘金后端響應(yīng)前端用戶登錄成功
          15. 掘金前端給用戶展示登錄成功頁(yè)面
          通過(guò)以上來(lái)看,整個(gè)流程真的挺復(fù)雜的,步驟繁多。所以我用時(shí)序圖給大家畫(huà)出來(lái)這一切的交互

          掘金OAuth2登錄流程.png

          我們需要重點(diǎn)關(guān)注的幾個(gè)步驟

          • 第三點(diǎn)與第四點(diǎn)(跳轉(zhuǎn)到微信掃碼登錄頁(yè))
            當(dāng)我們從掘金跳轉(zhuǎn)到微信掃碼頁(yè)面的時(shí)候,我們可以觀察下微信掃碼頁(yè)面的URL
            https://open.weixin.qq.com/connect/qrconnect?appid=wx1f78f78832fc2c16&redirect_uri=https%3A%2F%2Fjuejin.im%2Fpassport%2Fauth%2Flogin_success&response_type=code&scope=snsapi_login&state=0d26ae7d3gASoVCgoVPZIDU5OTlkODY2ZDg1MTA1YmJkYjhjOTY4NzI4Y2VkMzYzoU6-aHR0cHM6Ly9qdWVqaW4uaW0vb2F1dGgtcmVzdWx0oVYBoUkAoUQAoUHRCjChTdEKMKFIqWp1ZWppbi5pbaFSBKJQTNEDQaZBQ1RJT06goUyyaHR0cHM6Ly9qdWVqaW4uaW0voVTZIDJjNzMzMWI5YzdkMzk5MzljYjYyYjdiODllOTJlNDZioVcAoUYAolNBAKFVww%253D%253D#wechat_redirect
          URL中有三個(gè)關(guān)鍵參數(shù)
          • appid:appId,第三方的唯一標(biāo)識(shí)
          • redirect_uri:授權(quán)成功后的跳轉(zhuǎn)URL
          • scope:權(quán)限范圍
          關(guān)于appId,這里稍微補(bǔ)充一下。當(dāng)掘金需要利用微信做第三方授權(quán)登錄時(shí),掘金需要去微信的開(kāi)放平臺(tái)上面“注冊(cè)”。這個(gè)“注冊(cè)”操作,其實(shí)就是申請(qǐng)appId、appSecret、填寫(xiě)授權(quán)成功后的跳轉(zhuǎn)URL、以及掘金的權(quán)限范圍。
          當(dāng)我們跳轉(zhuǎn)到微信掃碼登錄頁(yè)的時(shí)候,會(huì)把a(bǔ)ppId、授權(quán)成功后的跳轉(zhuǎn)URL、權(quán)限范圍作為參數(shù),這時(shí)微信的授權(quán)服務(wù)其實(shí)會(huì)根據(jù)appId進(jìn)行一系列的校驗(yàn):
          • appId是否正確(你不能隨便瞎傳一個(gè)appId,否則微信怎么知道是否是合法的第三方呢?)
          • 根據(jù)appId校驗(yàn)授權(quán)成功后的跳轉(zhuǎn)URL是否正確(如果跳轉(zhuǎn)的URL不是注冊(cè)時(shí)填寫(xiě)的URL,是不被允許的)
          • 根據(jù)appId校驗(yàn)第三方的權(quán)限范圍是否正確(第三方本次授權(quán)的權(quán)限范圍不能超過(guò)它申請(qǐng)時(shí)的范圍。比如申請(qǐng)時(shí)只需要查詢用戶信息,但是本次授權(quán)卻需要查詢用戶好友列表,這肯定是不被微信允許的)
          當(dāng)驗(yàn)證信息通過(guò)后,微信授權(quán)頁(yè)面才會(huì)打開(kāi),展示用戶掃碼的頁(yè)面。
          • 第七點(diǎn)(校驗(yàn)用戶授權(quán)信息)
            當(dāng)用戶用微信授權(quán)并同意的時(shí),這時(shí)用戶會(huì)提交授權(quán)同意信息給微信授權(quán)服務(wù)。這時(shí),微信授權(quán)服務(wù)主要做三個(gè)任務(wù):
            • 驗(yàn)證權(quán)限范圍:第三方軟件可能需要用戶個(gè)人信息、用戶好友列表、用戶所在地等權(quán)限信息,但是作為用戶為了保護(hù)自己的隱私,不一定會(huì)把全部的信息給到第三方,用戶可以自由選擇哪些允許授權(quán)。
            • 生成授權(quán)碼:當(dāng)用戶同意授權(quán)后,微信授權(quán)服務(wù)會(huì)為本次授權(quán)生成授權(quán)碼。
            • 重定向至第三方URL:微信授權(quán)服務(wù)授權(quán)碼成功后,需要告知第三方軟件,它要通過(guò)跳轉(zhuǎn)到第三方的URL上。
          • 第八點(diǎn)(授權(quán)碼)
            授權(quán)碼是一個(gè)非常關(guān)鍵的信息,它用于后續(xù)與appSecret配合,獲取訪問(wèn)令牌。關(guān)于授權(quán)碼,我們要知道的是:
            這里授權(quán)碼生命周期設(shè)計(jì)的如此短,而且它是一次性的,主要是為了安全。因?yàn)槭跈?quán)碼是微信通過(guò)重定向跳轉(zhuǎn)到第三方URL上的,所以授權(quán)碼是直接暴露在外的。
            • 授權(quán)碼是一次性的,用了一次之后,微信會(huì)把它作廢,后續(xù)想要使用,必須使用新的授權(quán)碼。
            • 授權(quán)碼是有時(shí)間限制的,而且這個(gè)時(shí)間是非常短的,官方推薦是10分鐘以內(nèi),而大部分授權(quán)平臺(tái)授權(quán)碼的有效時(shí)間一般是3~5分鐘。
          • 第十點(diǎn)(訪問(wèn)令牌)
            掘金想要訪問(wèn)到用戶的資源,最終還是要通過(guò)訪問(wèn)令牌去請(qǐng)求用戶的資源。授權(quán)碼其實(shí)只是一個(gè)臨時(shí)的通行證。獲取訪問(wèn)令牌有三個(gè)關(guān)鍵參數(shù):
            微信根據(jù)上述三個(gè)參數(shù),校驗(yàn)第三方是否存在,appSecret是否正確,授權(quán)碼是否正確來(lái)生成訪問(wèn)令牌。
            至于訪問(wèn)令牌的種類,不同的軟件授權(quán)服務(wù)有不同的規(guī)則,它可以是一串UUID,也可以是JWT,我們?nèi)粘J褂玫膖oken都適合的。只不過(guò)大家要注意的是,OAuth2和JWT其實(shí)并沒(méi)有絕對(duì)依賴的關(guān)系,不要一開(kāi)始就把二者混為一談,否則后續(xù)很容易讓自己云里霧里。
            當(dāng)掘金拿到訪問(wèn)令牌后,就可以訪問(wèn)用戶資源接口,獲取用戶信息了。
            其實(shí)很多人不理解,為什么要弄一個(gè)授權(quán)碼還弄一個(gè)訪問(wèn)令牌呢?直接一步到位不就好了嗎?
            我們仔細(xì)看看時(shí)序圖,授權(quán)碼是微信通過(guò)瀏覽器的URL重定向告訴掘金的,所以基本上沒(méi)啥安全性可言,大家都能知道它;
            而訪問(wèn)令牌則是掘金的后端服務(wù)器直接與微信授權(quán)服務(wù)通信,獲取到的,因此它的安全性是比較好的。
            另外,有些軟件授權(quán)服務(wù)不僅僅會(huì)返回訪問(wèn)令牌(accessToken),還會(huì)返回一個(gè)刷新令牌(refreshToken)。刷新令牌的作用其實(shí)和授權(quán)碼很相似,就是通過(guò)刷新令牌獲取訪問(wèn)令牌,而且訪問(wèn)令牌也是一次性的,也有有效期,只不過(guò)它的有效期會(huì)相對(duì)比較久,有些軟件的刷新令牌有效期是一周。
            為什么有這個(gè)刷新令牌呢?因?yàn)樵L問(wèn)令牌是有有效期的。假設(shè)沒(méi)有刷新令牌,當(dāng)訪問(wèn)令牌過(guò)期后,如果第三方軟件還要繼續(xù)獲取用戶資源信息,那么只有一個(gè)辦法了:告訴用戶訪問(wèn)令牌過(guò)期,讓用戶重新走一遍訪問(wèn)令牌申請(qǐng)流程。毫無(wú)疑問(wèn),這個(gè)用戶體驗(yàn)是非常差的。而如果有刷新令牌,那么第三方軟件可以再訪問(wèn)令牌過(guò)期前,在后端靜默的申請(qǐng)一個(gè)新的訪問(wèn)令牌,而整個(gè)流程是用戶無(wú)感知的。

            大廠獲取accessToken的時(shí)序圖

            微信授權(quán)接入文檔
            • 微信
            • appId:用戶的唯一標(biāo)識(shí),微信授權(quán)服務(wù)需要校驗(yàn)第三方是否存在
            • appSecret:還記得上述我們說(shuō)過(guò),掘金需要去微信開(kāi)放平臺(tái)注冊(cè)時(shí)的申請(qǐng)的appSecret嗎?就是在這里用上了。
            • 授權(quán)碼:第八點(diǎn)生成的授權(quán)碼
          微信獲取accessToken時(shí)序圖.png
          • 支付寶
          支付寶授權(quán)接入文檔
          支付寶獲取accessToken時(shí)序圖.png

          資源擁有者憑據(jù)許可(賬號(hào)密碼類型)

          關(guān)于資源擁有者憑據(jù)許可,我們可以換個(gè)方式想象一下。假設(shè),微信把掘金收購(gòu)了,也就是掘金變成了微信的,那么微信賬號(hào)密碼直接告訴給掘金也沒(méi)關(guān)系,反正大家都是一家人,也不存在什么賬號(hào)密碼泄露的問(wèn)題,用同一套登錄服務(wù)就行了。
          那么用戶就能直接用微信的賬號(hào)密碼獲取訪問(wèn)令牌,后續(xù)掘金獲取用戶資源直接利用訪問(wèn)令牌就可以了。

          客戶端憑據(jù)許可

          客戶端憑據(jù)許可這個(gè)類型的應(yīng)用場(chǎng)景,其實(shí)主要是“資源擁有者被塞進(jìn)了第三方軟件中” 或者 “第三方軟件就是資源擁有者”。它主要是通過(guò)appId與appSecret獲取訪問(wèn)令牌直接訪問(wèn)用戶資源。
          大家可以想象一下“云存儲(chǔ)服務(wù)器”。比如“七牛云存儲(chǔ)”、“阿里云OSS”,我們可以用我們自己編寫(xiě)的軟件,訪問(wèn)我們的云盤。而我們作為資源擁有者,與我們自己的軟件合二為一。而且我們的軟件與“七牛云存儲(chǔ)”、“阿里云OSS”是直接通過(guò)后端交互訪問(wèn)的,所以安全性會(huì)比較好,可以直接通過(guò)appId與appSecret獲取訪問(wèn)令牌。

          隱式許可(簡(jiǎn)單類型)

          這種類型其實(shí)應(yīng)用的非常少,主要是用于第三方軟件只有前端,沒(méi)有后端的情況。因?yàn)橹挥星岸耍缘谌杰浖苯忧度霝g覽器中,通過(guò)瀏覽器與授權(quán)服務(wù)交互。這種情況,基本上就沒(méi)有所謂的安全性可言了,因此也不需要appSecret了,前端直接通過(guò)appId就可以獲取到accessToken。

          點(diǎn)個(gè)在看支持我吧,轉(zhuǎn)發(fā)就更好了
          瀏覽 77
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩成人影片 | 一级操逼视频看看 | 美女脱光色情视频网站亚洲 | 狼人综合色婷婷在线 | www.污污污在线观看 |