1. 程式人生 > >Auth2.0 授權碼模式個人分析思路

Auth2.0 授權碼模式個人分析思路

介面設計:獲取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