你管這破玩意叫 OAuth
今天,我想登陸豆瓣,看看電影評論,陶冶陶冶情操。
但是,我從來沒註冊過豆瓣賬號,而我又懶得再註冊一個,怎麼辦呢?
我打開豆瓣的官網,笑了,原來豆瓣早就爲我這種懶人想到了辦法。
懶人三步
第一步:在豆瓣官網點擊用 QQ 登陸。
第二步:跳轉到 qq 登錄頁面輸入用戶名密碼,然後點授權並登錄。
第三步:跳回到豆瓣頁面,成功登錄。
太方便了!
但這短短的幾秒鐘,可不簡單,我來給你說說。
上帝視角看發生了什麼
這幾秒鐘之內發生的事情,在外行的用戶視角看來,就是在豆瓣官網上輸了個 qq 號和密碼就登錄成功了。
在一些細心的用戶視角看來,頁面經歷了從豆瓣到 qq,再從 qq 到豆瓣的兩次頁面跳轉。
但作爲一羣專業的程序員,我們還應該從上帝視角來看這個過程。
第一步:在豆瓣官網點擊用 qq 登錄
當你點擊用 qq 登錄的小圖標時,實際上是向豆瓣的服務器發起了一個請求。
http:// www.douban.com/leadToAuthorize
豆瓣服務器會響應一個重定向地址,指向 qq 授權登錄的頁面地址。
http:// www.qq.com/authorize
當然,這個重定向地址還附帶了一個回調地址,這是在 QQ 那邊登陸成功後需要跳回的豆瓣地址。
http://www.qq.com/authorize?
callback=www.douban.com/callback
這跳回的地址是必然的嘛,不然 QQ 怎麼知道在我這邊登陸成功後我要幹嘛,上杆子找人家 QQ 授權的網站那麼多。
這部分的流程是黃色的這部分。
第二步:跳轉到 qq 登錄頁面輸入用戶名密碼,然後點授權並登錄
上一步,瀏覽器接到重定向地址
http://www.qq.com/authorize?
callback=www.douban.com/callback
自然沒什麼好說的,乖乖訪問過去。
用戶輸入 QQ 號和密碼,點擊授權並登陸,這裏走 QQ 服務器自己的校驗邏輯,與豆瓣毫無關係。
若校驗成功,會響應給瀏覽器一個重定向地址
www.douban.com/callback
沒錯,就是上一步傳給 QQ 服務器的 callback 參數!
但除了這個地址外,還附上了一個 code,我們叫它授權碼。
www.douban.com/callback?code=xxx
這個 code 是豆瓣服務唯一關心的事情,至於你那邊如何校驗用戶,無所謂,只要最終能給我一個 code 碼,我就認爲這個用戶在你那裏登陸成功了。
這部分的流程是黃色的這部分。
第三步:跳回到豆瓣頁面,成功登錄
這一步背後的過程其實是最繁瑣的,但對於用戶來說是完全感知不到的。
用戶在 QQ 登錄頁面點擊授權登陸後,就直接跳轉到豆瓣首頁了,但其實經歷了很多隱藏的過程。
首先接上一步,QQ 服務器在判斷登錄成功後,使頁面重定向到之前豆瓣發來的 callback 並附上 code 授權碼。
www.douban.com/callback?code=xxx
瀏覽器接到重定向,乖乖發起請求,此時請求的是豆瓣服務器。
豆瓣服務器收到請求後,對 QQ 服務器發起了兩次請求:
-
用拿到的 code 去換 token
-
再用拿到的 token 換取用戶信息
這個 code 和 token 都是有失效時間的,也因此保證了只要不在短時間內泄漏出去,就不會有安全風險。
拿到用戶信息之後,就返回給了瀏覽器。注意此時的瀏覽器上是豆瓣的首頁,豆瓣也因此可以將你的個人信息展示出來。
這部分的流程是黃色的這部分。
至此,整個過程結束。
這個破玩意,就叫做 OAuth 2.0 協議。
這個流程目的是讓大家從全局瞭解 oauth2.0 協議實際上發生了什麼,並僅僅以 oauth 的其中一種模式,授權碼模式進行講解。
如想了解更多模式,以及每次的請求和響應的標準齊全的參數,推薦讀一下阮一峯的文章。
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
爲啥要這麼跳來跳去
爲什麼,要這麼麻煩呢?跳來跳去的。
其實之所以有這個協議,我總結起來有兩點原因:
懶 + 不信任
懶是指用戶懶。
如果用戶不那麼懶,直接在豆瓣上新註冊一個賬號就好了。
不信任是什麼意思呢?
如果用戶信任豆瓣網站,那完全可以讓用戶在豆瓣網站輸入 QQ 的用戶名和密碼,由豆瓣傳給 QQ 服務器做校驗,並返回用戶信息。
但這是不可能的,你願意把你的 QQ 號和密碼給豆瓣看到?
更甚者,如果 QQ 信任豆瓣,用戶也信任豆瓣,那 QQ 也可以把自己的數據庫直接拷貝給豆瓣,然後豆瓣就可以完全自己擁有一套 QQ 用戶數據了,也就可以讓用戶使用 QQ 登陸。
當然,這也是不可能的。
所以就有了 OAuth 這種協議,你進行第三方授權時(文中的 QQ),用戶名和密碼是不經過目標服務器的(文中的豆瓣),這保證了授權的安全性。
第三方授權服務器只給目標服務器返回有時效性的 code 和 token,目標服務器通過這個去第三方資源服務器,換取用戶信息,這達成了拿到用戶信息的目的。
所以總的來說,oauth 協議,就是由於目標服務器不信任第三方服務器,又想使用第三方服務器的授權功能,以及獲取第三方服務器存儲的用戶信息,而產生的一個辦法。
這個破玩意,就叫做** OAuth 2.0 協議**。
哦,上面好像說過了。
禮物
瞭解了上述過程後,代碼自然就不難寫了。
這裏我實現了一個極簡版的 oauth2.0 用於體驗這個過程,大家可以參考下。
項目結構非常簡單,只有兩個模塊,分別是豆瓣和 QQ,分別啓動即可。
最終效果也非常簡單清晰,下面請忍受 low 逼的顯示效果
第一步,登陸豆瓣頁面。
第二步,使用 QQ 頁面進行授權。
第三步,授權成功跳回豆瓣首頁。
想獲得這份源碼的同學,加我好友看我朋友圈第一條即可,加好友方式見公衆號菜單欄喲。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/d2Q4oXARBSIm_wlwyAgfAw