Auth2.0 授權碼模式個人分析思路
阿新 • • 發佈:2019-01-24
介面設計:獲取code的介面+獲取access_token+獲取資源伺服器
頁面設計:登入頁->授權頁 (需要開啟app並判斷是否已登入,未登入先登入,已登入則調到授權頁(可靜默授權直接返回到 redirect_uri))
①建立一個開放平臺用於開發者註冊獲取app key、app secret,然後app key與app secret會將資料儲存到認證伺服器 #此處需建立一個數據表(開發者資訊表-developer 表、authorzation表)
開發者資訊表(developer):id、app_key(相當於微信的appid、oauth2.0中的client_id)、app_secret、redirect_uri(授權後的回撥地址)、code(用於記錄授權碼)、access_token、username、desc、created_at、updated_at
認證表(authorization):id、developer_id(索引對應的開發者資訊)、user_id(使用者id索引)、code、access_token、expires_in、created_at、updated_at #可合併到使用者表
注:開放平臺返回時可能會存在第三方應用的正式網址,但是這樣可能會存在本地驗證測試問題
②在客戶端(即向我們開放平臺申請使用者資訊的使用者的站點)向認證伺服器發起 類似以下請求
GET /authorize?response_type =code&client_id=s6BhdRkqt3&state=xyz # 整個get請求需要強正則驗證順序
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 # redirect_uri寫在開放文件中,用於認證完回撥的的地址
Host: server.example.com # 認證伺服器
請求到認證伺服器,先判斷是否已登入(未登入跳轉到登入頁面),反之跳轉到使用者授權頁面(建議靜默授權無需使用者點選確認),授權後根據redirect_uri返回授權碼(相應的authorzation認證表更新授權碼code及updated_at)。 !!關鍵!! 注:判斷是否已登入和跳轉到授權頁面中間存在一個等待的長連線過程(可開一個程序用於維持長連線tcp或websocket用於及時更新到給對方狀態)
上面想錯了,可以使用session標記是否授權狀態,決定使用者是否登入後進而判斷驗證client_id返回授權碼code
響應:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
注:以上是請求後返回的響應,state用於防止csrf攻擊
③上一步獲取了授權碼code(get可獲取),由於這裡是經過使用者授權通過後獲取到的code,所以是安全的,發起請求如下:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
這裡驗證code、redirect_uri,然後更新authorization中 access_token、updated_at
??問題??:授權碼要繫結使用者嗎?每一個使用者對應一個授權碼? 目前情況是分理處一個認證表(authorization)用於單獨為每個使用者繫結,最好就是將該表合併到使用者表
響應:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store # 不得快取
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value" } ④獲取access_token後即可獲取指定資源(過期重新refresh_token即可) 參考資料: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
http://www.cnblogs.com/yuanloo/p/4330098.html
請求到認證伺服器,先判斷是否已登入(未登入跳轉到登入頁面),反之跳轉到使用者授權頁面(建議靜默授權無需使用者點選確認),授權後根據redirect_uri返回授權碼(相應的authorzation認證表更新授權碼code及updated_at)。 !!關鍵!!
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value" } ④獲取access_token後即可獲取指定資源(過期重新refresh_token即可) 參考資料: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
http://www.cnblogs.com/yuanloo/p/4330098.html