細說RESTful API安全之認證受權

認證受權包含2個方面:
(1)訪問某個資源時必須攜帶用戶身份信息,如:用戶登陸時返回用戶access_token,訪問資源時攜帶該參數。
(2)檢查用戶是否具有訪問當前資源(url或數據)的權限:訪問資源時檢查用戶權限。html


在REST架構中,access_token被定義爲用戶身份標識,用於對資源訪問受權,只容許系統合法用戶訪問資源。具體來講:
 - 必須在每次訪問時都攜帶access_token參數,參數位置能夠位於HTTP消息頭(HTTP Basic Authentication),也可放在請求參數列表中。
 - 若是在訪問請求中不存在access_token參數,或者驗證access_token不合法(不存在或者不正確),拒絕訪問,必須強制用戶登陸。java


如何生成安全有效的用戶access_token?
acces_token做爲用戶身份標識,必然與數據庫中的用戶一一對應,即:<access_token : user_id>。
在網絡通訊中,一切數據都是透明的,都能被抓包截獲,因此必須保證access_token具有以下特性:
1. access_token須要知足分佈式環境下的全局惟一性
2. access_token中不該該包含用戶信息,若是將用戶id編碼到access_token中很容易泄露系統用戶信息(一般用戶id都是自增加的,很容易曝露系統當前用戶規模等信息)。
3. access_token應該是動態變化的,即:用戶每次登陸時獲得的access_token值都與上一次登陸不一樣。這樣保證參數沒有規律性,避免被用於網絡攻擊。
4. access_token應該具有必定特徵,用於參數合法性驗證,如:長度必須知足30個字符。git


參照如上需求,能夠按照以下方式設計access_token:
(1)用戶登陸時,動態生成UUID做爲該用戶的access_token,同時以access_token爲key,用戶id爲value存入redis。
(2)用戶訪問資源時攜帶access_token,解析驗證請求參數。
(3)若是access_token在redis中不存在,則說明用戶還未登陸,強制用戶登陸;轉到(1)。
(4)若是access_token不合法(如字符長度不知足),強制用戶從新登陸;轉到(1)。
(5)驗證access_token經過,繼續其餘權限驗證或者資源訪問。github


此外,根據業務場景能夠做以下約定以加強access_token安全性:
1. 設置access_token超時時間,即:超過必定時間以後就必須讓access_token失效,強制用戶從新登陸。
2. 使用HTTP Basic Authentication,將access_token放在http消息頭中而不是直接放在請求參數裏,這樣作更加規範。
3. 因爲UUID會使用時間戳,因此須要對集羣內服務器進行時鐘同步redis

注意:
JDK提供的默認UUID實現是基於名字空間的UUID(UUID Version 3)和基於僞隨機數的UUID(UUID Version 4),很難保證在分佈式環境下是全局惟一的。一個可選的開源Java UUID實現組件:
https://github.com/cowtowncoder/java-uuid-generator Java Uuid Generator (JUG),提供基於時間和MAC地址的UUID Version 1實現數據庫

固然,若是在實際的業務系統中能保證名稱惟一,好比用戶手機或者郵箱,那麼能夠直接使用JDK基於名稱空間的UUID V3實現。api

之因此選擇UUID做爲access_token實現,基於以下考慮:
(1)性能:UUID生成在本地完成,高效。
(2)簡單有效:只要保證access_token全局惟一便可,且能夠動態變化。安全

 

實際上,實現認證最優雅的方式應該是使用JWT,這是一個Token標準。服務器


【參考】
https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81 UUID
https://www.zhihu.com/question/34876910 UUID是如何保證惟一性的?
http://blog.csdn.net/fengshizty/article/details/48754609 App開放接口api安全性—Token簽名sign的設計與實現
http://www.cnblogs.com/QLeelulu/archive/2009/11/22/1607898.html 訪問須要HTTP Basic Authentication認證的資源的各類語言的實現
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization
https://zxc0328.github.io/2015/11/04/http-basic-auth/ Http Basic Authorization的使用網絡

相關文章
相關標籤/搜索