Oauth2.0 協議到底是幹什麼的?
寫在前面,本人寫這篇 Oauth2.0 協議文章,只是突發奇想,瞭解了下市面上的第三方登入的原理。本人並沒有深入去理解 Oauth2.0 協議,如果理解不對的地方,歡迎指正。
今天登入一個從未體驗過的 App ,提醒要註冊。一般情況下,我都會拿一個小號作為第三方登入的源泉,而不選擇用手機號去註冊。
這裡的套路,大家都明白吧?
能不填手機號,就儘量別填,營銷簡訊實在是太多了,防不勝防啊!

image
點選確認以後,就可以進入 App 使用了。而不需要再通過手機號、郵箱等方式去註冊。之前我一直在想,這實現原理究竟是什麼呢?
能夠做出第三方登入的那幾家大廠,不可能直接暴露使用者帳號和密碼的介面給對方的。中間肯定是有一個媒介,作為兩邊資料互通的橋樑,相當於多年以前「支付寶」的角色。
大致思路已經知道了,接下來具體的業務場景是怎麼互動的。
假設有兩家軟體企業 W 和 Y,其中 W 企業我們假設為微信, Y 企業假設為印象筆記。即 W (微信)的使用者可以把各種資料、表情包傳到 Y (印象筆記)上長期儲存,然後可以在不同的裝置上檢視。
如果你是這個需求的開發,會怎麼去實現?
W (微信):讓 Y (印象筆記)給我們提供一個介面,我怎麼牛批,難道還要我去適配它?開玩笑。。。
趕緊的,速速給我提供一個介面:
ofollow,noindex">https://keithxiaoy.com/saveData?account=nobug&data=kgezuishuai ...
引數:account = Y 的登入賬號 、data = 儲存的資料
返回:成功 true、失敗 false
有了這個介面,W 軟體只需在介面上顯示一個輸入框,讓使用者輸入他的 Y 軟體賬號,然後呼叫這個介面來儲存資料即可。
實現起來這麼容易?怎麼可能。。。
不行?你總要給我個說法吧。
開放這樣一個介面,相當於直接把 Y 公司的儲存資料的介面全部暴露在網上,對於黑客來說,要發現這個介面太容易了。這樣的話,Y 公司的使用者資料就很危險了。
那怎麼辦?
這樣吧,為了保證不能存資料到 Y ,我們把介面改成這樣:
https://keithxiaoy.com/saveData?account=nobug&password=kgezuishuai&data=kgezhentamashuai ....
除了要求 W 使用者輸入賬號,還要輸入密碼。只有當賬號密碼驗證通過,資料才儲存到 Y 伺服器。這樣,即使黑客發現了這個介面,他不知道使用者的密碼,也就沒辦法作惡了。
這樣總行了吧?
如果不是我這次查了下 Oauth 協議,我就理所當然的認為安全了。雖然黑客可以用撞庫破解密碼,但就我們這點隱私,還不至於讓黑客發動攻擊吧!
不就是儲存點學習資料嗎?黑客難道想跟我學習日語嗎?
現實中,這個方案還是不可行!為什麼?
因為兩個企業之間根本沒有信任可言,商場如戰場。人與人之間的信任都很難實現,更不要說兩個企業之間了。
Y 企業會想,W 企業會不會偷偷收集使用者的帳號和密碼。如果這些都讓他知道了,那公司離倒閉也不遠了。
站在使用者的角度,使用者會想“憑什麼要我在 W 軟體裡面輸入 Y 的密碼,W 軟體會不會把我 Y 的密碼也記住呢?”。
怎麼辦?
我們先看下三方的互動模型

image
在這個場景下,使用者 keithxiaoy 要儲存筆記,訪問他在 Y 的筆記資料庫,但是他不能直接和 Y 操作,而必須通過 W。我們現在要解決的,就是讓 keithxiaoy 放心,也讓 Y 放心的方案。
大家聯想到我開頭寫到的「支付寶」了嗎?
Oauth2.0 就是類似於原始「支付寶」的功能,為了解決這個信任危機而提出來的互動模型。它告訴人們,在這種場景下,三方要怎麼解決彼此的信任危機。
具體來說,Oauth2.0 的互動模型的核心是這個樣子的:

image
資源擁有者:keithxiaoy
客戶端:W 企業
資源伺服器:Y 企業
鑑權伺服器:類似於支付寶的功能,是一個對使用者的身份進行認證、並對客戶端進行授權的地方。一般情況下,鑑權伺服器也是 Y 公司
再回頭來看開頭的那張授權圖。

image
第三方授權的原理,其實就是 Oauth2.0。
在這個頁面輸入 Y 企業的帳號和密碼,那麼 W 企業是無法拿到的。
如果使用者同意授權登入,鑑權伺服器會通知 Y ,並給 W 傳送一個訪問令牌 Access Token 。有了這個訪問令牌,W 就可以到 Y 的伺服器上面去儲存資源或者獲取資源了。
最後,真正的介面形式會是這樣的:
https://keithxiaoy.com/saveData?accesstoken=xxxxxx ...
Y 的伺服器在接收到這個請求之後,會拿著 Access Token,再去找鑑權伺服器,檢查這個 Access Token 的合法性和許可權,如果通過的話,才返回資料給客戶端 W。
看到這裡,大家明白 Oauth2.0 協議到底是幹什麼的了嗎?
嗯嗯,明白了,K哥真帥...
文中舉例皆虛構,不代表現實世界任意一家企業。如有雷同,純屬巧合。