token是服務端生成的一串字符串,以做客戶端進行請求的令牌,當第一次登錄後,服務器生成一個token便將此token返回給客戶端,之後客戶端只要帶上這個token前來請求數據便可,無需再次帶上用戶名和密碼算法
基於token的身份驗證api
使用基於token的身份驗證方法,在服務端不須要存儲用戶的登陸記錄.流程是這樣的: 客戶端使用用戶名跟密碼去請求登陸,服務度段收到請求,去驗證用戶名和密碼,驗證成功後,服務端會簽發一個token,再把這個token發送給客戶端,客戶頓收到token之後能夠把它存儲起來,好比放在cookie裏面或者local storage裏面,客戶端每次向服務端請求資源的時候須要帶上服務端簽發的token,服務端收到請求,而後去驗證客戶端請求裏面帶着的token,若是驗證成功,以某種方式好比隨機生成32位的字符串做爲token,存儲在服務器中,並返回token到APP,之後APP請求時,凡是須要驗證的地方都要帶上該token,而後服務端驗證token,成功返回所須要的結果,失敗返回錯誤信息, 從新登陸,服務器上的token設置一個有效期,每次APP請求時都要驗證token和有效期.跨域
token的優點:安全
1.無狀態.可擴展服務器
在客戶端存儲的token是無狀態的,而且能被擴展的.基於這種無狀態和不存儲session信息,負載均衡器可以將用戶的信息從一個服務器傳到另外一個服務器上.若是將已經驗證的信息保存在session中,則每次請求都須要用戶向已驗證的服務器發送驗證信息(稱爲session親和性).用戶量大時,可會形成一些擁堵.可是不要着急,使用token以後問題就會解決,由於token本身hold住了用戶的驗證信息.cookie
2. 安全性session
請求過程當中發送token而再也不發送cookie可以防止csrf(跨站請求僞造).即便在客戶端使用了cookie存儲token,cookie也僅僅是一個存儲機制而不是用於認證,不將信息存儲在session中,讓咱們少了對session操做,token是有實效的,一段時間以後須要從新驗證,咱們也不必定須要等到token自動實效,token有撤回的操做,經過token revocation可使一個特定的token或是一組相同認證的token無效.負載均衡
3. 可擴展性加密
token可以將建立與其餘程序共享權限的程序.例如,能將一個隨便的社交帳號和本身的大號聯繫起來.當經過服務登陸(咱們將這個過程Buffer)時,咱們能夠將這些buffer附到登陸的數據流上.使用token時, 能夠提供可選的權限給第三方應用程序,當用戶想讓另外一個應用程序訪問他們的數據,咱們能夠經過創建api,得出特殊權限的tokensspa
4. 多平臺跨域
提早先談論下CORS(跨域資源共享), 對應用程序和服務進行擴展的時候,須要介入各類的設備和應用程序,讓咱們的api只提供數據服務,咱們還能夠作出設計選擇來提供cdn中的資產.這消除了在爲應用程序設置快速標頭配置後CORS出現的問題,只要用戶有一個經過了驗證的token,數據和資源就可以在任何域上被請求到.
1. 將荷載payload,以及header信息進行Base64加密,造成密文payload密文,header密文
2. 將造成的密文用句號連接起來,用服務端祕鑰進行HS256加密,生成簽名
3.將前面的兩個密文後面用句號連接簽名造成最終的token返回給服務端
注:
(1) 用戶請求時攜帶此token(分爲三部分,header密文, payload密文,簽名)到服務端,服務端解析第一部分(header密文),用base64解密,能夠知道用了什麼算法,此處解析發現是HS256
(2). 服務端使用原來的祕鑰與密文(header密文+"."+payload密文)一樣進行HS256運算,而後用生成的簽名與token攜帶的簽名進行比對,若一致說明token合法,不一致說明原文被修改
(3). 判斷是否過時,客戶端經過用base64解密第二部分(payload密文),能夠知道荷載中受權時間,以及有效期.經過這個與當前時間對比發現token是否過時
1.用戶登陸校驗,校驗成功後就返回token給客戶端
2. 客戶端收到數據後保存在客戶端
3. 客戶端每次訪問api是攜帶token到服務器端
4. 服務器端採用filter過濾器校驗. 校驗成功則返回請求數據,校驗失敗則返回錯誤碼