OAuth 2.0詳解
概念
:OAuth(開放授權)是一個開放標准,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如基本消息,照片,聯系人列表),
而無需將 用戶名 和 密碼 提供給第三方應用。
一、應用場景
為了理解OAuth的適用場合,這里舉一個使用第三方賬戶進行登錄的例子。
現在一般登陸都會采用 第三方授權 登陸,比較常見就是微信、qq、微博授權登陸。這里以微信授權登陸為例:
現在我在未注冊的情況下去訪問A網站
,A網站 為了提高用戶體驗,可以省去你在這次網站申請注冊的步驟,讓你通過微信
授權登陸去拿去你在微信上的基本信息。
問題就在這里,如果拿到微信用戶
基本信息給到A網站,直接給A網站我登陸微信的賬號密碼,那么問題可想而知。
1、這個也太不安全了,我只想給A網站我的在微信上的基本信息,而不是所有信息,通過用戶密碼可以獲取我的所有信息。
2、用戶只有修改密碼,才能收回賦予"A網站"的權力。但是這樣做,會使得其他所有獲得用戶授權的第三方應用程序全部失效。
3、只要有一個第三方應用程序被破解,就會導致用戶密碼泄漏,以及所有被密碼保護的數據泄漏。
OAuth就是為了解決上面這些問題而誕生的。
從上面可以看出主要有三個身份
用戶
使用第三方賬戶登錄一個新的網站,對於用戶來說就不需要走復雜的注冊流程。
第三方平台
(微信)
上面來講 微信 就是第三方平台,那么對於第三方如何做才能保證用戶的安全呢?
就在A網站在通過微信授權登陸之前,需要提供資質到微信,微信審核,審核通過后給要求接入的服務商一個唯一憑證,標明服務商身份。
服務商(A網站)
我們要做的就是將這兩者進行連接起來,先到第三方平台資質審核,審核通過后,用戶去第三方平台授權登錄后,就可以獲取用戶基本信息,完成登陸。
二、OAuth的思路
這里還是以 服務商(A網站)
,和 第三方平台(微信)
授權登錄來縷這個思路。
OAuth在 服務商(A網站) 與 第三方平台(微信) 之間,設置了一個授權層(authorization layer)。服務商 不能直接登錄 第三方平台,只能登錄授權層,
以此將用戶與服務商(A網站)區分開來。服務商(A網站) 登錄授權層所用的令牌
(token),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的權限范圍和有效期。
服務商(A網站) 登錄授權層以后,第三方平台 根據令牌的權限范圍和有效期,向 服務商(A網站) 開放用戶儲存的資料。
這里縷下大致流程
1、接入前准備(資質審核)
如果一個服務商需要使用第三方平台的服務,那么首先是需要向第三方平台提供資料,第三方平台審核通過后,會給服務商一個唯一標識的ID,這樣通過第三方平台授權的時候,
第三方平台就知道是哪個商戶了。

一般來說你會得到如下的兩個參數:
appid 代表你的應用唯一ID
appsecret 對應的密鑰
這個部分每家平台都不一樣,具體如何獲取你的APPID請參考對應平台的指南.
注意
第三方平台給你的不一定是APPID,我的意思不是連名字都完全一樣,有的平台給的參數多有的給的少,總之都是用於驗明身份的.
2、用戶要使用第三方登陸

這里我們以登錄為例.
在這個流程中服務器(A網站)接受到了用戶想要第三方登錄的請求,我們使用之前獲取的APPID(不同平台叫法和參數可能不同),然后拼接為成第三方平台指定的url
然后直接重定向到這個url.

例如在這個例子中我們的地址可能長這個樣子:
www.xxx.com/oauth2.0/authorize?appid=123456&redirect=www.sss.com/login
參數:
appid 我們的應用對於第三方平台的唯一id
redirect 用戶同意授權后被重定向的地址,一般來說都是本應用的首頁或者登錄頁面,在本例中就是www.sss.com/login這個地址.
其他參數 根據第三方平會有不同的額外參數.
然后將用戶重定向到這個url中,此時用戶會跳轉到www.xxx.com(因為如果用戶授權成功,你總要回調服務商接口,來告訴它,已經授權成功).
3、用戶授權成功
用戶授權成功后,微信就會請求上面redirect參數中的接口地址,帶上授權成功的參數code

在這個例子中這個url看起來是這個樣子的
www.sss.com/login?code=xxxxx
4、獲取用戶token(令牌)
此時我們的www.sss.com/login接受到了一個含有code的請求,我們知道這個是一個第三方登錄授權后的請求.
我們再次拼接一個url(不同平台地址規則不同),但是一般來說這個請求會有如下的參數:
code 用戶授權后重定向帶回來的code
appid 應用唯一id
appsecret 應用對應的密鑰
在這個例子中我們請求服務器的url可能是這個樣子的:
www.xxx.com/oauth2/access_token?appid=xxxx&secert=xxxx&code=xxxx

如果一切順利在這個階段我們就可以獲取第三方平台響應的一個accesstoken
,這個accesstoken代表着用戶對於這個應用的授權.
除此以外你還會獲取到用戶的基本信息例如用戶的唯一id之類的,后續的請求用戶的信息需要使用accesstoken進行請求。
5、獲取用戶基本信息
利用accesstoken我們向服務器獲取了用戶的名字,顯示在了我們的應用中, 后續的資源獲取就是這個模式(不同平台資源獲取地址以及方式有可能稍有不同).

6、補充
1、微信認證成功后,我會會把accesstoken存放在cookie
中,這樣不用每次都需要用戶去授權認證,而是我們后台去請問微信,這個時候用戶是不會感知的。
2、accesstoken不是一直有效的,它會有過期時間的,就好比微信掃碼登陸中accesstoken有效時間是2小時。
3、那么accesstoken時效,是不是就要用戶重新授權登陸了,當然也不是,如果沒2小時都要重新授權登陸那體驗也太差了。這里會有個叫refresh_token
,
它是在你第一次獲取accesstoken一起給你的,也就是說如果你的accesstoken時效了,你還可以通過refresh_token去獲取用戶信息。這么說refresh_token的
時效時間肯定要比accesstoken,微信掃碼登陸refresh_token有效時間是30天
4、也就是當refresh_token也時效的時候,才會需要用戶重新授權登陸。
具體的可以看看微信掃碼登陸的官方文檔:網站應用微信登錄開發指南
參考
1、輕松理解OAuth2.0協議(多圖) (非常感謝)
2、OAuth2.0 知多少(偏實戰)
別人罵我胖,我會生氣,因為我心里承認了我胖。別人說我矮,我就會覺得好笑,因為我心里知道我不可能矮。這就是我們為什么會對別人的攻擊生氣。
攻我盾者,乃我內心之矛(22)