基於OAuth2.0協議 第三方登陸與數據同步驗證設計

前段時間,公司跟別的公司簽定合做夥伴,搞了一個第三方登陸與數據共享同步,是基於OAuth2.0協議,如今空閒了,作一下筆記。git

到github下載一個OAuth2.0的PHP類庫(固然,你也能夠本身寫一個^-^,但我的以爲不必造輪子),有寫好Mysql與Mongodb的Demo,參考一下,而後嵌套本身的業務代碼,下面是客戶端與服務端的交互流程:github


+-----------+ +-----------+
| | 帶client_id的URL請求獲取code | |
| | --------------------------------> | |
| | | |
| | 返回帶 code 的URL | |
| | <-------------------------------- | |
| | | |
| | 帶code的URL請求回去access_token | |
| | --------------------------------> | |
| client | | server |
| | 返回帶 access_token JSON數據 | |
| | <-------------------------------- | |
| | | |
| | 帶access_token的URL請求獲取openid | |
| | --------------------------------> | |
| | | |
| | 返回帶 openid 的JSON數據 | |
| | <-------------------------------- | |
+-----------+ +-----------+sql

詳細的URL參數就不在上圖展現了,如今說明一下上圖URL請求與返回的參數做用:dom

在說明步驟以前,咱們須要知道在真個OAuth認證過程當中,咱們須要三個數據表,分別是:client,code,token。curl

step 1:
在作第三方登陸API時,要生成一個 client_id 和 client_secret 給合做夥伴,URL上還要帶上什麼redirect_uri之類的參數就很少說了,值得注意一點是,在URL上傳值時最好帶上 「加密的簽名」 ,防止CSRF,在返回時,再對 簽名驗證數據的合法性。post

step 2:
經過 client_id 認證 partner,生成code,並存儲在code表,還存儲了code的有效期等信息,而後返回code(通常code的有效期是很短或已經請求一次就無效了)ui

step 3:
經過上一步返回的code,去獲取令牌,去獲取access_token時,必定要作簽名認證(如散列值:client_id+client_secret+timestamp+code),服務端再作散列值認證,要不路由可能會出賣你了-_-!!!加密

step 4:
簽名經過與數據認證,生成access_token,並存儲在token表,還存儲了access_token有效期等信息,而後返回access_token,能夠把它存儲起來,由於它在服務端存儲是有必定的有效期,有效期設置得看開發API的人還有access_token以後的用途,可能獲取其餘信息有用處,例如:數據分享。url

step 5:
經過 access_totken 請求獲取使用第三方登陸者在服務端的openid,該openid對於客戶端是惟一值的,可使用散列值 domain+uid 之類的,這一步交互請求也要作簽名認證,像第三步同樣。code

step 6:
接收到openid,驗證用戶是否在平臺上註冊了,若是沒有驗證,填寫註冊或綁定信息。

 

上面是第三方登陸的方案,下面說說數據共享的方案:

+-----------+ +-----------+
| | 帶grant_type的URL獲取refresh_token| |
| | --------------------------------> | |
| | | |
| | 返回續期的 access_token | |
| client | <-------------------------------- | server |
| | | |
| | 帶access_token與openid的post請求 | |
| | --------------------------------> | |
+-----------+ +-----------+

step 1:
客戶端判斷 access_token 是否已通過期了,若是過時了則執行續期操做,不然step1,step2能夠省略,交互須要簽名驗證。

step 2:
返回access_token更新原來的access_token值。

step 3: 數據開始同步,使用curl JSON交互之類的,數據交互須要簽名驗證,判斷access_token的有效期與解密openid,獲取平臺的用戶id

相關文章
相關標籤/搜索