項目背景
最近在開發一個微信公衆號商城,在調用下單、支付、查詢訂單等等接口時,須要驗證用戶的身份。微信提供了openid做爲識別用戶身份的憑證,能夠結合openid設計一套用戶身份權限認證機制。考慮到安全性和易實現程度,備選的方案有Session認證機制和Token認證機制,本文在比較了二者的特色後選擇了Token認證機制,而後詳細闡述瞭如何實現Token認證機制。前端
接口設計
在尋找合適的認證方式以前,先說明一下項目先後端的設計。項目的先後端是分離的,前端使用AJAX的方式向後端請求操做資源(增、刪、改);後端接口設計遵循RESTful API原則,結果以JSON格式返回。web
身份認證備選方案
Session認證
在web網站中,session能夠將訪客狀態記錄在服務器中,並分配一個惟一的session id給訪客,並將該id附加在headers中返回給客戶端。客戶端接收到session id後,會將id存儲在cookie,以後客戶端每次訪問服務器,傳送的cookie中都會攜帶session id,服務器以此來識別訪客的身份。
數據庫
Token認證
token認證方式中客戶端和服務器的交互過程與session的相似,客戶端向服務端請求token,拿到token後,客戶端能夠在以後的請求中將token附加在header,以驗證用戶的身份和權限。
後端
比較兩種認證方式
【此處應該列舉諸多不一樣,可是必定要提到爲何token更適合,而不是session】api
- token認證更靈活。對於session認證,客戶端每次發送求情都會發送cookie;而對於token認證,能夠在須要身份驗證的場景下才發送token。
- token容許多域名認證。cookie是綁定單域名的,在a域名生成的cookie沒法用於b域名,因此session id沒法做爲不一樣域名的共同認證id。而token認證則不受限制,token能夠附加在任何請求上。
- 在客戶端的存儲方式不一樣。session自動存儲在cookie,而token則須要定義存儲的方式。token一般能夠存儲在localStorage(永久存儲,瀏覽器關閉時不清除token)、sessionStorage(瀏覽器關閉時token會被清除)、cookie。值得一提的是,即便將token存儲在cookie,也能夠免疫CSRF,由於cookie中的token並不用於認證。
- CSRF(跨站請求僞造)。認證免疫CSRF(跨站請求僞造),而session認證則存在遭受CSRF的可能性。
- 跨站腳本攻擊(XSS)。相對於session認證,token認證更容易遭受跨站腳本攻擊(XSS)。
本項目考慮到Token認證機制更靈活,例如token能夠控制是否附加在請求、token自己能夠進行自定義加密、能夠將token存儲在cookie之外的地方,因此選定Token認證機制做爲商城應用的用戶身份權限認證機制。瀏覽器
獲取token的流程
![獲取token的流程 獲取token的流程](http://static.javashuo.com/static/loading.gif)
- 客戶端向服務端token接口提交code,請求獲取token。此處的code是引導用戶進入受權頁面後微信服務器附加上去的,詳細方法見微信公衆平臺的微信受權網頁文檔。
- 服務端經過code向微信公衆平臺換取用戶的openid。微信受權網頁有兩種受權scope,本項目只須要用戶的openid,不須要用戶更多的信息,因此將scope設爲snsapi_base。
- 微信公衆平臺向服務端返回了openid等等信息。
- 服務端生成token,將token和用戶信息以鍵值對的形式存儲後,服務端返回token給客戶端。
存儲token及用戶信息的流程
![存儲token及用戶信息的流程 存儲token及用戶信息的流程](http://static.javashuo.com/static/loading.gif)
- 服務端獲取用戶的openid後,在數據庫中登記用戶的信息,並取出用戶的id。
- 服務端以token爲key,以openid、user id、權限信息等爲value,將該鍵值對存入緩存中。在存入緩存時,注意設置緩存有效時間,過長的有效期存在安全隱患,對於本項目,用戶辦理業務後短期內不會再訪問,因此將token的有效期設置爲2小時。
調用接口時的token認證流程
![token認證流程 token認證流程](http://static.javashuo.com/static/loading.gif)
- 客戶端將token附加在header,向業務接口發送請求。
-
業務接口在執行業務邏輯前,憑token驗證用戶的身份。分別驗證如下三點:緩存
- token的合法性(有記錄)
- token的有效性(沒過時)
- Token對應的用戶權限Auth
總結
Token機制的特色
- 使用靈活,能夠選擇性認證。
- 能夠多個域名使用同一token認證體系。
- 在客戶端的存儲靈活,除了存儲在cookie,還能夠選擇localStorage、sessionStorage。
- 免疫CSRF(跨站請求僞造)。
Token認證機制的三個流程
- 獲取Token的流程。
- 存儲Token及身份權限信息的流程。
- 調用接口時的Token認證流程。特別注意須要驗證token的合法性、時效性、關聯的用戶權限。