天天看點

你管這破玩意叫 OAuth2?

今天,我想登陸豆瓣,看看電影評論,陶冶陶冶情操。

但是,我從來沒注冊過豆瓣賬号,而我又懶得再注冊一個,怎麼辦呢?

我打開豆瓣的官網,笑了,原來豆瓣早就為我這種懶人想到了辦法。

懶人三步

第一步:在豆瓣官網點選用 QQ 登陸。

你管這破玩意叫 OAuth2?

第二步:跳轉到 qq 登入頁面輸入使用者名密碼,然後點授權并登入。

你管這破玩意叫 OAuth2?

第三步:跳回到豆瓣頁面,成功登入。

你管這破玩意叫 OAuth2?

太友善了!

但這短短的幾秒鐘,可不簡單,我來給你說說。

上帝視角看發生了什麼

這幾秒鐘之内發生的事情,在外行的使用者視角看來,就是在豆瓣官網上輸了個 qq 号和密碼就登入成功了。

在一些細心的使用者視角看來,頁面經曆了從豆瓣到 qq,再從 qq 到豆瓣的兩次頁面跳轉。

但作為一群專業的程式員,我們還應該從上帝視角來看這個過程。

你管這破玩意叫 OAuth2?

第一步:在豆瓣官網點選用 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 授權的網站那麼多。

這部分的流程是黃色的這部分。

你管這破玩意叫 OAuth2?

第二步:跳轉到 qq 登入頁面輸入使用者名密碼,然後點授權并登入

上一步,浏覽器接到重定向位址

http://www.qq.com/authorize?

callback=www.douban.com/callback

自然沒什麼好說的,乖乖通路過去。

這回通路的就是 QQ 的頁面了。

你管這破玩意叫 OAuth2?

使用者輸入 QQ 号和密碼,點選授權并登陸,這裡走 QQ 伺服器自己的校驗邏輯,與豆瓣毫無關系。

若校驗成功,會響應給浏覽器一個重定向位址

www.douban.com/callback

沒錯,就是上一步傳給 QQ 伺服器的 callback 參數!

但除了這個位址外,還附上了一個 code,我們叫它授權碼。

www.douban.com/callback?code=xxx

這個 code 是豆瓣服務唯一關心的事情,至于你那邊如何校驗使用者,無所謂,隻要最終能給我一個 code 碼,我就認為這個使用者在你那裡登陸成功了。

這部分的流程是黃色的這部分。

你管這破玩意叫 OAuth2?

第三步:跳回到豆瓣頁面,成功登入

這一步背後的過程其實是最繁瑣的,但對于使用者來說是完全感覺不到的。

使用者在 QQ 登入頁面點選授權登陸後,就直接跳轉到豆瓣首頁了,但其實經曆了很多隐藏的過程。

首先接上一步,QQ 伺服器在判斷登入成功後,使頁面重定向到之前豆瓣發來的 callback 并附上 code 授權碼。

www.douban.com/callback?code=xxx

浏覽器接到重定向,乖乖發起請求,此時請求的是豆瓣伺服器。

豆瓣伺服器收到請求後,對 QQ 伺服器發起了兩次請求:

1. 用拿到的 code 去換 token

2. 再用拿到的 token 換取使用者資訊

這個 code 和 token 都是有失效時間的,也是以保證了隻要不在短時間内洩漏出去,就不會有安全風險。

拿到使用者資訊之後,就傳回給了浏覽器。注意此時的浏覽器上是豆瓣的首頁,豆瓣也是以可以将你的個人資訊展示出來。

你管這破玩意叫 OAuth2?

這部分的流程是黃色的這部分。

你管這破玩意叫 OAuth2?

至此,整個過程結束。

這個破玩意,就叫做 OAuth 2.0 協定。

這個流程目的是讓大家從全局了解 oauth2.0 協定實際上發生了什麼,并僅僅以 oauth 的其中一種模式,授權碼模式進行講解。

如想了解更多模式,以及每次的請求和響應的标準齊全的參數,推薦讀一下阮一峰的文章。

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

為啥要這麼跳來跳去

為什麼,要這麼麻煩呢?跳來跳去的。

其實之是以有這個協定,我總結起來有兩點原因:

懶 + 不信任

懶是指使用者懶。

如果使用者不那麼懶,直接在豆瓣上新注冊一個賬号就好了。

不信任是什麼意思呢?

如果使用者信任豆瓣網站,那完全可以讓使用者在豆瓣網站輸入 QQ 的使用者名和密碼,由豆瓣傳給 QQ 伺服器做校驗,并傳回使用者資訊。

你管這破玩意叫 OAuth2?

但這是不可能的,你願意把你的 QQ 号和密碼給豆瓣看到?

更甚者,如果 QQ 信任豆瓣,使用者也信任豆瓣,那 QQ 也可以把自己的資料庫直接拷貝給豆瓣,然後豆瓣就可以完全自己擁有一套 QQ 使用者資料了,也就可以讓使用者使用 QQ 登入。

你管這破玩意叫 OAuth2?

當然,這也是不可能的。

是以就有了 OAuth 這種協定,你進行第三方授權時(文中的QQ),使用者名和密碼是不經過目标伺服器的(文中的豆瓣),這保證了授權的安全性。

第三方授權伺服器隻給目标伺服器傳回有時效性的 code 和 token,目标伺服器通過這個去第三方資源伺服器,換取使用者資訊,這達成了拿到使用者資訊的目的。

是以總的來說,oauth 協定,就是由于三者(使用者、目标、第三方)互相不信任,又想使用第三方伺服器的授權功能,以及擷取第三方伺服器存儲的使用者資訊,而産生的一個辦法。

這個破玩意,就叫做 OAuth 2.0 協定。

哦,上面好像說過了。