token简述
目錄
- 前言
- 1.什么是 token
- 2. 使用Token的意義
- 3. 基于Token的身份驗證
- 3.2 Token常用的兩種使用方式
- 3.2.1 用設備號 / 設備MAC地址作為Token
- 5. Token實現思路
- 6. Token優勢
- 6.1 無狀態、可擴展
- 6.2 安全性
- 6.3 可擴展性
- 6.4 多平臺跨域
- 6.5 基于標準
前言
對于初學者來說,對Token這個玩意兒比較陌生,根據手頭資料和自己粗淺的認知,在這里簡明扼要地介紹一下。
1.什么是 token
Token: 是當第一次登錄后,由服務端生成的一串字符串(即Token)。此字符串會返回給客戶端。以后客戶端只需帶上這個Token前來請求數據即可,無需再次帶上用戶名和密碼。
當客戶端頻繁向服務端請求數據、服務端頻繁的去數據庫查詢用戶名和密碼并進行對比時,Token將被作為客戶端請求的一個令牌,服務端據此判斷用戶名和密碼正確與否。
2. 使用Token的意義
減輕服務器的壓力,減少頻繁的查詢數據庫,使服務器更加健壯。
了解了Token的意義后,我們就更明確的知道為什么要用它了。
3. 基于Token的身份驗證
使用基于 Token 的身份驗證方法,在服務端不需要存儲用戶的登錄記錄。流程如下:
如,APP 登錄時發送加密的用戶名和密碼到服務器,服務器驗證用戶名和密碼,驗證成功,則以某種方式(比如隨機生成32位的字符串作為 token)存儲到服務器中,并返回 token 到APP。
后續當APP發起請求時,凡是需驗證的地方都攜帶上該token供服務器端驗證,驗證成功就返回所需結果;驗證失敗則返回錯誤信息,并要求重新登錄(注:服務器上 token 需設置有效期,每次 APP 發起請求時,驗證 token 和有效期)。
3.2 Token常用的兩種使用方式
3.2.1 用設備號 / 設備MAC地址作為Token
客戶端: 客戶端在登錄的時候獲取設備的設備號/MAC地址,并將其作為參數傳遞到服務端。
服務端: 服務端接收到該參數后,便用一個變量來接收,同時將其作為Token保存在數據庫,并將該Token設置到session中,客戶端每次請求的時候都要統一攔截,并將客戶端傳遞的token和服務器端session中的token進行對比,如果相同則放行,不同則拒絕。
分析: 此刻客戶端和服務器端就統一了一個唯一的標識Token,而且保證了每一個設備擁有了一個唯一的會話。
缺點:
客戶端需要帶設備號/MAC地址作為參數傳遞,而且服務器端還需要保存;在網絡不好或者并發請求時,會導致多次重復提交數據的問題。
優點: 客戶端不需重新登錄,只要登錄一次以后一直可以使用,至于超時的問題由服務器這邊處理:
若服務器的Token超時,服務器只需將客戶端傳遞的 Token 向數據庫中查詢,同時賦值給變量Token,如此,Token的超時又重新計時。
### 3.2.2 用session值作為Token **客戶端:** 客戶端只需攜帶用戶名和密碼登陸即可。
客戶端: 客戶端接收到用戶名和密碼后并判斷,如果正確了就將本地獲取 sessionID 作為 Token 返回給客戶端,客戶端以后只需帶上請求數據即可。
優點: 方便,不用存儲數據;
缺點: 當 session 過期后,客戶端必須重新登錄才能進行訪問數據。
# 4. Token原理 
注:
- 用戶請求時攜帶此token(分為三部分,header 密文,payload 密文,簽名)到服務端,服務端解析第一部分( header 密文),用 Base64 解密,可以知道用了什么算法進行簽名,此處解析發現是 HS256;
- 服務端使用原來的秘鑰與密文( header 密文+"."+payload 密文)同樣進行 HS256 運算,然后用生成的簽名與 token 攜帶的簽名進行對比,若一致說明 token 合法,不一致說明原文被修改;
- 判斷是否過期,客戶端通過用 Base64 解密第二部分(payload密文),可以知道荷載中授權時間,以及有效期。通過這個與當前時間對比發現token是否過期。
5. Token實現思路
#mermaid-svg-H0rupz2q9lwtvV5U .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-H0rupz2q9lwtvV5U .label text{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .node rect,#mermaid-svg-H0rupz2q9lwtvV5U .node circle,#mermaid-svg-H0rupz2q9lwtvV5U .node ellipse,#mermaid-svg-H0rupz2q9lwtvV5U .node polygon,#mermaid-svg-H0rupz2q9lwtvV5U .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-H0rupz2q9lwtvV5U .node .label{text-align:center;fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .node.clickable{cursor:pointer}#mermaid-svg-H0rupz2q9lwtvV5U .arrowheadPath{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-H0rupz2q9lwtvV5U .flowchart-link{stroke:#333;fill:none}#mermaid-svg-H0rupz2q9lwtvV5U .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-H0rupz2q9lwtvV5U .edgeLabel rect{opacity:0.9}#mermaid-svg-H0rupz2q9lwtvV5U .edgeLabel span{color:#333}#mermaid-svg-H0rupz2q9lwtvV5U .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-H0rupz2q9lwtvV5U .cluster text{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-H0rupz2q9lwtvV5U .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-H0rupz2q9lwtvV5U text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-H0rupz2q9lwtvV5U .actor-line{stroke:grey}#mermaid-svg-H0rupz2q9lwtvV5U .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-H0rupz2q9lwtvV5U .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-H0rupz2q9lwtvV5U #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-H0rupz2q9lwtvV5U .sequenceNumber{fill:#fff}#mermaid-svg-H0rupz2q9lwtvV5U #sequencenumber{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U #crosshead path{fill:#333;stroke:#333}#mermaid-svg-H0rupz2q9lwtvV5U .messageText{fill:#333;stroke:#333}#mermaid-svg-H0rupz2q9lwtvV5U .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-H0rupz2q9lwtvV5U .labelText,#mermaid-svg-H0rupz2q9lwtvV5U .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-H0rupz2q9lwtvV5U .loopText,#mermaid-svg-H0rupz2q9lwtvV5U .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-H0rupz2q9lwtvV5U .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-H0rupz2q9lwtvV5U .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-H0rupz2q9lwtvV5U .noteText,#mermaid-svg-H0rupz2q9lwtvV5U .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-H0rupz2q9lwtvV5U .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-H0rupz2q9lwtvV5U .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-H0rupz2q9lwtvV5U .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-H0rupz2q9lwtvV5U .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .section{stroke:none;opacity:0.2}#mermaid-svg-H0rupz2q9lwtvV5U .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-H0rupz2q9lwtvV5U .section2{fill:#fff400}#mermaid-svg-H0rupz2q9lwtvV5U .section1,#mermaid-svg-H0rupz2q9lwtvV5U .section3{fill:#fff;opacity:0.2}#mermaid-svg-H0rupz2q9lwtvV5U .sectionTitle0{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .sectionTitle1{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .sectionTitle2{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .sectionTitle3{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-H0rupz2q9lwtvV5U .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .grid path{stroke-width:0}#mermaid-svg-H0rupz2q9lwtvV5U .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-H0rupz2q9lwtvV5U .task{stroke-width:2}#mermaid-svg-H0rupz2q9lwtvV5U .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .taskText:not([font-size]){font-size:11px}#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-H0rupz2q9lwtvV5U .task.clickable{cursor:pointer}#mermaid-svg-H0rupz2q9lwtvV5U .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-H0rupz2q9lwtvV5U .taskText0,#mermaid-svg-H0rupz2q9lwtvV5U .taskText1,#mermaid-svg-H0rupz2q9lwtvV5U .taskText2,#mermaid-svg-H0rupz2q9lwtvV5U .taskText3{fill:#fff}#mermaid-svg-H0rupz2q9lwtvV5U .task0,#mermaid-svg-H0rupz2q9lwtvV5U .task1,#mermaid-svg-H0rupz2q9lwtvV5U .task2,#mermaid-svg-H0rupz2q9lwtvV5U .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutside0,#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutside2{fill:#000}#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutside1,#mermaid-svg-H0rupz2q9lwtvV5U .taskTextOutside3{fill:#000}#mermaid-svg-H0rupz2q9lwtvV5U .active0,#mermaid-svg-H0rupz2q9lwtvV5U .active1,#mermaid-svg-H0rupz2q9lwtvV5U .active2,#mermaid-svg-H0rupz2q9lwtvV5U .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-H0rupz2q9lwtvV5U .activeText0,#mermaid-svg-H0rupz2q9lwtvV5U .activeText1,#mermaid-svg-H0rupz2q9lwtvV5U .activeText2,#mermaid-svg-H0rupz2q9lwtvV5U .activeText3{fill:#000 !important}#mermaid-svg-H0rupz2q9lwtvV5U .done0,#mermaid-svg-H0rupz2q9lwtvV5U .done1,#mermaid-svg-H0rupz2q9lwtvV5U .done2,#mermaid-svg-H0rupz2q9lwtvV5U .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-H0rupz2q9lwtvV5U .doneText0,#mermaid-svg-H0rupz2q9lwtvV5U .doneText1,#mermaid-svg-H0rupz2q9lwtvV5U .doneText2,#mermaid-svg-H0rupz2q9lwtvV5U .doneText3{fill:#000 !important}#mermaid-svg-H0rupz2q9lwtvV5U .crit0,#mermaid-svg-H0rupz2q9lwtvV5U .crit1,#mermaid-svg-H0rupz2q9lwtvV5U .crit2,#mermaid-svg-H0rupz2q9lwtvV5U .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-H0rupz2q9lwtvV5U .activeCrit0,#mermaid-svg-H0rupz2q9lwtvV5U .activeCrit1,#mermaid-svg-H0rupz2q9lwtvV5U .activeCrit2,#mermaid-svg-H0rupz2q9lwtvV5U .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-H0rupz2q9lwtvV5U .doneCrit0,#mermaid-svg-H0rupz2q9lwtvV5U .doneCrit1,#mermaid-svg-H0rupz2q9lwtvV5U .doneCrit2,#mermaid-svg-H0rupz2q9lwtvV5U .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-H0rupz2q9lwtvV5U .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-H0rupz2q9lwtvV5U .milestoneText{font-style:italic}#mermaid-svg-H0rupz2q9lwtvV5U .doneCritText0,#mermaid-svg-H0rupz2q9lwtvV5U .doneCritText1,#mermaid-svg-H0rupz2q9lwtvV5U .doneCritText2,#mermaid-svg-H0rupz2q9lwtvV5U .doneCritText3{fill:#000 !important}#mermaid-svg-H0rupz2q9lwtvV5U .activeCritText0,#mermaid-svg-H0rupz2q9lwtvV5U .activeCritText1,#mermaid-svg-H0rupz2q9lwtvV5U .activeCritText2,#mermaid-svg-H0rupz2q9lwtvV5U .activeCritText3{fill:#000 !important}#mermaid-svg-H0rupz2q9lwtvV5U .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-H0rupz2q9lwtvV5U g.classGroup text .title{font-weight:bolder}#mermaid-svg-H0rupz2q9lwtvV5U g.clickable{cursor:pointer}#mermaid-svg-H0rupz2q9lwtvV5U g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-H0rupz2q9lwtvV5U g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-H0rupz2q9lwtvV5U .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-H0rupz2q9lwtvV5U .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-H0rupz2q9lwtvV5U .dashed-line{stroke-dasharray:3}#mermaid-svg-H0rupz2q9lwtvV5U #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U .commit-id,#mermaid-svg-H0rupz2q9lwtvV5U .commit-msg,#mermaid-svg-H0rupz2q9lwtvV5U .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-H0rupz2q9lwtvV5U g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-H0rupz2q9lwtvV5U g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-H0rupz2q9lwtvV5U g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-H0rupz2q9lwtvV5U .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-H0rupz2q9lwtvV5U .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-H0rupz2q9lwtvV5U .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-H0rupz2q9lwtvV5U .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-H0rupz2q9lwtvV5U .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-H0rupz2q9lwtvV5U .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-H0rupz2q9lwtvV5U .edgeLabel text{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-H0rupz2q9lwtvV5U .node circle.state-start{fill:black;stroke:black}#mermaid-svg-H0rupz2q9lwtvV5U .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-H0rupz2q9lwtvV5U #statediagram-barbEnd{fill:#9370db}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-state .divider{stroke:#9370db}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-H0rupz2q9lwtvV5U .note-edge{stroke-dasharray:5}#mermaid-svg-H0rupz2q9lwtvV5U .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-H0rupz2q9lwtvV5U .error-icon{fill:#522}#mermaid-svg-H0rupz2q9lwtvV5U .error-text{fill:#522;stroke:#522}#mermaid-svg-H0rupz2q9lwtvV5U .edge-thickness-normal{stroke-width:2px}#mermaid-svg-H0rupz2q9lwtvV5U .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-H0rupz2q9lwtvV5U .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-H0rupz2q9lwtvV5U .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-H0rupz2q9lwtvV5U .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-H0rupz2q9lwtvV5U .marker{fill:#333}#mermaid-svg-H0rupz2q9lwtvV5U .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-H0rupz2q9lwtvV5U {color: rgba(0, 0, 0, 0.75);font: ;}用戶登錄校驗成功客戶端服務端返回token保存token- 客戶端每次訪問API均攜帶Token;
- 服務器端采用 filter 過濾器校驗。校驗成功就返回請求數據,校驗失敗則返回錯誤碼。
6. Token優勢
6.1 無狀態、可擴展
在客戶端存儲的 Tokens 是無狀態的,并且能夠被擴展。基于這種無狀態和不存儲 Session信息,負載負載均衡器能夠將用戶信息從一個服務傳到其他服務器上。如果我們將已驗證的用戶的信息保存在 Session 中,則每次請求都需要用戶向已驗證的服務器發送驗證信息(稱為 Session 親和性)。用戶量大時,可能會造成 一些擁堵。但是不要著急。使用 tokens 之后這些問題都迎刃而解,因為 tokens 自己 hold 住了用戶的驗證信息。
6.2 安全性
請求中發送 token 而不再是發送 cookie 能夠防止 CSRF (跨站請求偽造)。即使在客戶端使用 cookie 存儲 token,cookie 也僅僅是一個存儲機制而不是用于認證。不將信息存儲在 Session 中,讓我們少了對 session 操作。token 是有時效的,一段時間之后用戶需要重新驗證。我們也不一定需要等到 token 自動失效,token 有撤回的操作,通過 token revocataion 可以使一個特定的 token 或是一組有相同認證的 token 無效。
6.3 可擴展性
Tokens 能夠創建與其它程序共享權限的程序。例如,能將一個任意的社交帳號和自己的大號( Fackbook 或是 Twitter)聯系起來。當通過服務登錄 Twitter (我們將這個過程 Buffer)時,我們可以將這些 Buffer 附到 Twitter 的數據流上。使用 tokens 時,可以提供可選的權限給第三方應用程序。當用戶想讓另一個應用程序訪問它們的數據,我們可以通過建立自己的 API,得出特殊權限的 tokens。
6.4 多平臺跨域
我們提前先來談論一下 CORS(跨域資源共享),對應用程序和服務進行擴展的時候,需要介入各種各種的設備和應用程序。只要用戶有一個通過了驗證的 token,數據和資源就能夠在任何域上被請求到。Access-Control-Allow-Origin: *
6.5 基于標準
創建 token 的時候,你可以設定一些選項。但是標準的用法會在 JSON Web Tokens體現。最近的程序和文檔是供給 JSON Web Tokens 的。它支持眾多的語言。這意味在未來的使用中你可以真正的轉換你的認證機制。
文中如有錯誤,敬請批評指正!~
總結
- 上一篇: 可能这些是你想要的H5软键盘兼容方案
- 下一篇: RabbitMQ消息队列简单异步邮件发送