傳統(tǒng)Web應(yīng)用中,前后端并不分離,用戶登錄后在服務(wù)端會話中保存用戶的AccessToken并為用戶在服務(wù)器端開辟存儲與資源空間(就像一個小房間一樣,而AccessToken就像房間的鑰匙),并把此AccessToken發(fā)送給前端瀏覽器,瀏覽器通過Cookie的方式保存起來,瀏覽器每次請求均攜帶此AccessToken,請求到達后服務(wù)端根據(jù)此AccessToken來識別具體的用戶用戶空間,并訪問用戶的存儲和權(quán)限等資源。
平臺系統(tǒng)對外提供API時,目前主流的做法是采用RESTful風(fēng)格的接口服務(wù),對所有來訪的端均一視同仁,無論是App端、PC端、微信小程序端、硬件端還是前后端分離的前端,這樣開發(fā)一套API就可以服務(wù)所有的端用戶。
在前后端分離的架構(gòu)模型中,是沒有“自動”化的機制完成AccessToken的回傳與檢驗的,這部分工作要由我們自己手動來完成。
端是對用戶GUI界面的統(tǒng)稱,此處意指APP、微小小程序、微信公眾號、PC、第三方系統(tǒng)、智能設(shè)備等,下同。
第三方訪問憑據(jù)
平臺為第三方維護基本信息,其中包含了兩個重要的數(shù)據(jù)字段AppId和AppSecret,其中AppId和平臺本地用戶的登錄名是起相同的作用,它用來唯一的標識一個第三方合作單位;而AppSecret和平臺本地用戶的登錄密碼是起相同的作用,它是一個密鑰或者叫密碼。


登錄與令牌
如果是平臺本地用戶,用戶在端界面輸入登錄名或密碼及驗證碼后,提交至平臺服務(wù)端,經(jīng)過重重驗證機制后獲取一個AccessToken和過期時間保存在本地,調(diào)用接口時傳入AccessToken即可。
如果是第三方合作平臺,通過調(diào)用指定的接口并傳入AppId和AppSecret,直接換取一個AccessToken令牌和過期時間保存在本地,調(diào)用接口時傳入AccessToken即可。
服務(wù)端生成用戶的訪問令牌(可以是一個GUID),并在庫中查詢出該用戶的權(quán)限列表信息,然后將用戶信息、登錄時間、過期時間、權(quán)限列表有組織的入庫(防止服務(wù)器斷電或異常造成的令牌信息丟失),然后在緩存中也保存一份兒(鍵名就是生成的真實的Token)。

用戶與服務(wù)器正常的交互,僅訪問緩存中令牌信息;服務(wù)器啟動時,掃描庫中未過期的令牌信息并讀入緩存,同時將過期的令牌信息清除掉;訂閱捕獲緩存失效移除事件,將庫中對應(yīng)的令牌清除掉;設(shè)立定時器,定期掃描庫中的令牌信息,移除過期的令牌。

令牌安全性
令牌是開放的,有可能被惡意用戶偽造篡改,從而訪問到其他用戶的資源信息(雖然這種機率非常小),因此必須引入簽名機制。
服務(wù)器端生成令牌后,將令牌通過服務(wù)端的私鑰進行簽名,然后組合出來一個復(fù)合令牌,令牌的格式為:真實令牌|過期時間|簽名串,發(fā)送給端的令牌其實是這個復(fù)合令牌。

令牌檢驗
定義一個過濾器,統(tǒng)一對令牌進行攔截處理,在此過濾器中主要做兩件事情:1.驗證令牌是否存在,不存在就直接返回錯誤信息;2.驗證令牌是否過期,如果過期就移除緩存和庫中的數(shù)據(jù)

令牌的續(xù)期
對于平臺本地用戶,用戶每次使用令牌訪問接口時,通過重重驗證后,重置用戶令牌的有效期,例如而默認令牌有效期是20分鐘,用戶9點登錄成功,在9點10分做了一次操作訪問了一次接口,原本用戶的令牌再有15分鐘就會自動失效,由于用戶做了一次合法的接口調(diào)用,此時令牌重置回20分鐘。

對于第三方合作平臺,為了保證安全性,令牌是不會自動續(xù)期的,需要第三方自行注意過期時間并在適當時間刷新令牌,刷新令牌時每次都會生成一個新令牌替換掉舊令牌。
對于平臺本地用戶,令牌有效期比較短,一般設(shè)為20分鐘即可(1200秒);對于第三方合作平臺,令牌有效期稍長一些,一般設(shè)為2個小時(7200秒)。
通信安全性
對所有接口施加CA證書,開啟https通信協(xié)議,在協(xié)議層面對數(shù)據(jù)加密防止信息泄露