token简述
目錄
- 前言
- 1.什么是 token
- 2. 使用Token的意義
- 3. 基于Token的身份驗(yàn)證
- 3.2 Token常用的兩種使用方式
- 3.2.1 用設(shè)備號(hào) / 設(shè)備MAC地址作為Token
- 5. Token實(shí)現(xiàn)思路
- 6. Token優(yōu)勢(shì)
- 6.1 無(wú)狀態(tài)、可擴(kuò)展
- 6.2 安全性
- 6.3 可擴(kuò)展性
- 6.4 多平臺(tái)跨域
- 6.5 基于標(biāo)準(zhǔn)
前言
對(duì)于初學(xué)者來說,對(duì)Token這個(gè)玩意兒比較陌生,根據(jù)手頭資料和自己粗淺的認(rèn)知,在這里簡(jiǎn)明扼要地介紹一下。
1.什么是 token
Token: 是當(dāng)?shù)谝淮蔚卿浐?#xff0c;由服務(wù)端生成的一串字符串(即Token)。此字符串會(huì)返回給客戶端。以后客戶端只需帶上這個(gè)Token前來請(qǐng)求數(shù)據(jù)即可,無(wú)需再次帶上用戶名和密碼。
當(dāng)客戶端頻繁向服務(wù)端請(qǐng)求數(shù)據(jù)、服務(wù)端頻繁的去數(shù)據(jù)庫(kù)查詢用戶名和密碼并進(jìn)行對(duì)比時(shí),Token將被作為客戶端請(qǐng)求的一個(gè)令牌,服務(wù)端據(jù)此判斷用戶名和密碼正確與否。
2. 使用Token的意義
減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫(kù),使服務(wù)器更加健壯。
了解了Token的意義后,我們就更明確的知道為什么要用它了。
3. 基于Token的身份驗(yàn)證
使用基于 Token 的身份驗(yàn)證方法,在服務(wù)端不需要存儲(chǔ)用戶的登錄記錄。流程如下:
如,APP 登錄時(shí)發(fā)送加密的用戶名和密碼到服務(wù)器,服務(wù)器驗(yàn)證用戶名和密碼,驗(yàn)證成功,則以某種方式(比如隨機(jī)生成32位的字符串作為 token)存儲(chǔ)到服務(wù)器中,并返回 token 到APP。
后續(xù)當(dāng)APP發(fā)起請(qǐng)求時(shí),凡是需驗(yàn)證的地方都攜帶上該token供服務(wù)器端驗(yàn)證,驗(yàn)證成功就返回所需結(jié)果;驗(yàn)證失敗則返回錯(cuò)誤信息,并要求重新登錄(注:服務(wù)器上 token 需設(shè)置有效期,每次 APP 發(fā)起請(qǐng)求時(shí),驗(yàn)證 token 和有效期)。
3.2 Token常用的兩種使用方式
3.2.1 用設(shè)備號(hào) / 設(shè)備MAC地址作為Token
客戶端: 客戶端在登錄的時(shí)候獲取設(shè)備的設(shè)備號(hào)/MAC地址,并將其作為參數(shù)傳遞到服務(wù)端。
服務(wù)端: 服務(wù)端接收到該參數(shù)后,便用一個(gè)變量來接收,同時(shí)將其作為Token保存在數(shù)據(jù)庫(kù),并將該Token設(shè)置到session中,客戶端每次請(qǐng)求的時(shí)候都要統(tǒng)一攔截,并將客戶端傳遞的token和服務(wù)器端session中的token進(jìn)行對(duì)比,如果相同則放行,不同則拒絕。
分析: 此刻客戶端和服務(wù)器端就統(tǒng)一了一個(gè)唯一的標(biāo)識(shí)Token,而且保證了每一個(gè)設(shè)備擁有了一個(gè)唯一的會(huì)話。
缺點(diǎn):
客戶端需要帶設(shè)備號(hào)/MAC地址作為參數(shù)傳遞,而且服務(wù)器端還需要保存;在網(wǎng)絡(luò)不好或者并發(fā)請(qǐng)求時(shí),會(huì)導(dǎo)致多次重復(fù)提交數(shù)據(jù)的問題。
優(yōu)點(diǎn): 客戶端不需重新登錄,只要登錄一次以后一直可以使用,至于超時(shí)的問題由服務(wù)器這邊處理:
若服務(wù)器的Token超時(shí),服務(wù)器只需將客戶端傳遞的 Token 向數(shù)據(jù)庫(kù)中查詢,同時(shí)賦值給變量Token,如此,Token的超時(shí)又重新計(jì)時(shí)。
### 3.2.2 用session值作為Token **客戶端:** 客戶端只需攜帶用戶名和密碼登陸即可。
客戶端: 客戶端接收到用戶名和密碼后并判斷,如果正確了就將本地獲取 sessionID 作為 Token 返回給客戶端,客戶端以后只需帶上請(qǐng)求數(shù)據(jù)即可。
優(yōu)點(diǎn): 方便,不用存儲(chǔ)數(shù)據(jù);
缺點(diǎn): 當(dāng) session 過期后,客戶端必須重新登錄才能進(jìn)行訪問數(shù)據(jù)。
# 4. Token原理 
注:
- 用戶請(qǐng)求時(shí)攜帶此token(分為三部分,header 密文,payload 密文,簽名)到服務(wù)端,服務(wù)端解析第一部分( header 密文),用 Base64 解密,可以知道用了什么算法進(jìn)行簽名,此處解析發(fā)現(xiàn)是 HS256;
- 服務(wù)端使用原來的秘鑰與密文( header 密文+"."+payload 密文)同樣進(jìn)行 HS256 運(yùn)算,然后用生成的簽名與 token 攜帶的簽名進(jìn)行對(duì)比,若一致說明 token 合法,不一致說明原文被修改;
- 判斷是否過期,客戶端通過用 Base64 解密第二部分(payload密文),可以知道荷載中授權(quán)時(shí)間,以及有效期。通過這個(gè)與當(dāng)前時(shí)間對(duì)比發(fā)現(xiàn)token是否過期。
5. Token實(shí)現(xiàn)思路
#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: ;}用戶登錄校驗(yàn)成功客戶端服務(wù)端返回token保存token- 客戶端每次訪問API均攜帶Token;
- 服務(wù)器端采用 filter 過濾器校驗(yàn)。校驗(yàn)成功就返回請(qǐng)求數(shù)據(jù),校驗(yàn)失敗則返回錯(cuò)誤碼。
6. Token優(yōu)勢(shì)
6.1 無(wú)狀態(tài)、可擴(kuò)展
在客戶端存儲(chǔ)的 Tokens 是無(wú)狀態(tài)的,并且能夠被擴(kuò)展。基于這種無(wú)狀態(tài)和不存儲(chǔ) Session信息,負(fù)載負(fù)載均衡器能夠?qū)⒂脩粜畔囊粋€(gè)服務(wù)傳到其他服務(wù)器上。如果我們將已驗(yàn)證的用戶的信息保存在 Session 中,則每次請(qǐng)求都需要用戶向已驗(yàn)證的服務(wù)器發(fā)送驗(yàn)證信息(稱為 Session 親和性)。用戶量大時(shí),可能會(huì)造成 一些擁堵。但是不要著急。使用 tokens 之后這些問題都迎刃而解,因?yàn)?tokens 自己 hold 住了用戶的驗(yàn)證信息。
6.2 安全性
請(qǐng)求中發(fā)送 token 而不再是發(fā)送 cookie 能夠防止 CSRF (跨站請(qǐng)求偽造)。即使在客戶端使用 cookie 存儲(chǔ) token,cookie 也僅僅是一個(gè)存儲(chǔ)機(jī)制而不是用于認(rèn)證。不將信息存儲(chǔ)在 Session 中,讓我們少了對(duì) session 操作。token 是有時(shí)效的,一段時(shí)間之后用戶需要重新驗(yàn)證。我們也不一定需要等到 token 自動(dòng)失效,token 有撤回的操作,通過 token revocataion 可以使一個(gè)特定的 token 或是一組有相同認(rèn)證的 token 無(wú)效。
6.3 可擴(kuò)展性
Tokens 能夠創(chuàng)建與其它程序共享權(quán)限的程序。例如,能將一個(gè)任意的社交帳號(hào)和自己的大號(hào)( Fackbook 或是 Twitter)聯(lián)系起來。當(dāng)通過服務(wù)登錄 Twitter (我們將這個(gè)過程 Buffer)時(shí),我們可以將這些 Buffer 附到 Twitter 的數(shù)據(jù)流上。使用 tokens 時(shí),可以提供可選的權(quán)限給第三方應(yīng)用程序。當(dāng)用戶想讓另一個(gè)應(yīng)用程序訪問它們的數(shù)據(jù),我們可以通過建立自己的 API,得出特殊權(quán)限的 tokens。
6.4 多平臺(tái)跨域
我們提前先來談?wù)撘幌?CORS(跨域資源共享),對(duì)應(yīng)用程序和服務(wù)進(jìn)行擴(kuò)展的時(shí)候,需要介入各種各種的設(shè)備和應(yīng)用程序。只要用戶有一個(gè)通過了驗(yàn)證的 token,數(shù)據(jù)和資源就能夠在任何域上被請(qǐng)求到。Access-Control-Allow-Origin: *
6.5 基于標(biāo)準(zhǔn)
創(chuàng)建 token 的時(shí)候,你可以設(shè)定一些選項(xiàng)。但是標(biāo)準(zhǔn)的用法會(huì)在 JSON Web Tokens體現(xiàn)。最近的程序和文檔是供給 JSON Web Tokens 的。它支持眾多的語(yǔ)言。這意味在未來的使用中你可以真正的轉(zhuǎn)換你的認(rèn)證機(jī)制。
文中如有錯(cuò)誤,敬請(qǐng)批評(píng)指正!~
總結(jié)
- 上一篇: 可能这些是你想要的H5软键盘兼容方案
- 下一篇: 解决vue里iscroll(better