為用戶創(chuàng)造價(jià)值的開發(fā)公司

始終追求工匠精神,是您靠譜的H5開發(fā)、小程序開發(fā)、微信開發(fā)供應(yīng)商

藍(lán)暢首頁 >> 動(dòng)態(tài)

token是什么?token機(jī)制的原理是什么

時(shí)間:2020-04-28 00:48:20 | 來源:網(wǎng)絡(luò) 由藍(lán)暢整理

什么是token?

token的意思是“令牌”,是服務(wù)端生成的一串字符串,作為客戶端進(jìn)行請求的一個(gè)標(biāo)識。

當(dāng)用戶第一次登錄后,服務(wù)器生成一個(gè)token并將此token返回給客戶端,以后客戶端只需帶上這個(gè)token前來請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。

簡單token的組成;uid(用戶唯一的身份標(biāo)識)、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的一定長度的十六進(jìn)制字符串。為防止token泄露)。


token機(jī)制的原理是什么


身份認(rèn)證概述

由于HTTP是一種沒有狀態(tài)的協(xié)議,它并不知道是誰訪問了我們的應(yīng)用。這里把用戶看成是客戶端,客戶端使用用戶名還有密碼通過了身份驗(yàn)證,不過下次這個(gè)客戶端再發(fā)送請求時(shí)候,還得再驗(yàn)證一下。

通用的解決方法就是,當(dāng)用戶請求登錄的時(shí)候,如果沒有問題,在服務(wù)端生成一條記錄,在這個(gè)記錄里可以說明登錄的用戶是誰,然后把這條記錄的id發(fā)送給客戶端,客戶端收到以后把這個(gè)id存儲在cookie里,下次該用戶再次向服務(wù)端發(fā)送請求的時(shí)候,可以帶上這個(gè)cookie,這樣服務(wù)端會驗(yàn)證一下cookie里的信息,看能不能在服務(wù)端這里找到對應(yīng)的記錄,如果可以,說明用戶已經(jīng)通過了身份驗(yàn)證,就把用戶請求的數(shù)據(jù)返回給客戶端。

以上所描述的過程就是利用session,那個(gè)id值就是sessionid。我們需要在服務(wù)端存儲為用戶生成的session,這些session會存儲在內(nèi)存,磁盤,或者數(shù)據(jù)庫。

基于token機(jī)制的身份認(rèn)證

使用token機(jī)制的身份驗(yàn)證方法,在服務(wù)器端不需要存儲用戶的登錄記錄。大概的流程:

客戶端使用用戶名和密碼請求登錄。服務(wù)端收到請求,驗(yàn)證用戶名和密碼。驗(yàn)證成功后,服務(wù)端會生成一個(gè)token,然后把這個(gè)token發(fā)送給客戶端。客戶端收到token后把它存儲起來,可以放在cookie或者Local Storage(本地存儲)里??蛻舳嗣看蜗蚍?wù)端發(fā)送請求的時(shí)候都需要帶上服務(wù)端發(fā)給的token。服務(wù)端收到請求,然后去驗(yàn)證客戶端請求里面帶著token,如果驗(yàn)證成功,就向客戶端返回請求的數(shù)據(jù)。


利用token機(jī)制進(jìn)行登錄認(rèn)證,可以有以下方式:

a.用設(shè)備mac地址作為token

客戶端:客戶端在登錄時(shí)獲取設(shè)備的mac地址,將其作為參數(shù)傳遞到服務(wù)端

服務(wù)端:服務(wù)端接收到該參數(shù)后,便用一個(gè)變量來接收,同時(shí)將其作為token保存在數(shù)據(jù)庫,并將該token設(shè)置到session中。客戶端每次請求的時(shí)候都要統(tǒng)一攔截,將客戶端傳遞的token和服務(wù)器端session中的token進(jìn)行對比,相同則登錄成功,不同則拒絕。

此方式客戶端和服務(wù)端統(tǒng)一了唯一的標(biāo)識,并且保證每一個(gè)設(shè)備擁有唯一的標(biāo)識。缺點(diǎn)是服務(wù)器端需要保存mac地址;優(yōu)點(diǎn)是客戶端無需重新登錄,只要登錄一次以后一直可以使用,對于超時(shí)的問題由服務(wù)端進(jìn)行處理。

b.用sessionid作為token

客戶端:客戶端攜帶用戶名和密碼登錄

服務(wù)端:接收到用戶名和密碼后進(jìn)行校驗(yàn),正確就將本地獲取的sessionid作為token返回給客戶端,客戶端以后只需帶上請求的數(shù)據(jù)即可。

此方式的優(yōu)點(diǎn)是方便,不用存儲數(shù)據(jù),缺點(diǎn)就是當(dāng)session過期時(shí),客戶端必須重新登錄才能請求數(shù)據(jù)。

當(dāng)然,對于一些保密性較高的應(yīng)用,可以采取兩種方式結(jié)合的方式,將設(shè)備mac地址與用戶名密碼同時(shí)作為token進(jìn)行認(rèn)證。

APP利用token機(jī)制進(jìn)行身份認(rèn)證

用戶在登錄APP時(shí),APP端會發(fā)送加密的用戶名和密碼到服務(wù)器,服務(wù)器驗(yàn)證用戶名和密碼,如果驗(yàn)證成功,就會生成相應(yīng)位數(shù)的字符產(chǎn)作為token存儲到服務(wù)器中,并且將該token返回給APP端。

以后APP再次請求時(shí),凡是需要驗(yàn)證的地方都要帶上該token,然后服務(wù)器端驗(yàn)證token,成功返回所需要的結(jié)果,失敗返回錯(cuò)誤信息,讓用戶重新登錄。其中,服務(wù)器上會給token設(shè)置一個(gè)有效期,每次APP請求的時(shí)候都驗(yàn)證token和有效期。

token的存儲

token可以存到數(shù)據(jù)庫中,但是有可能查詢token的時(shí)間會過長導(dǎo)致token丟失(其實(shí)token丟失了再重新認(rèn)證一個(gè)就好,但是別丟太頻繁,別讓用戶沒事兒就去認(rèn)證)。

為了避免查詢時(shí)間過長,可以將token放到內(nèi)存中。這樣查詢速度絕對就不是問題了,也不用太擔(dān)心占據(jù)內(nèi)存,就算token是一個(gè)32位的字符串,應(yīng)用的用戶量在百萬級或者千萬級,也是占不了多少內(nèi)存的。

token的加密

token是很容易泄露的,如果不進(jìn)行加密處理,很容易被惡意拷貝并用來登錄。加密的方式一般有:

在存儲的時(shí)候把token進(jìn)行對稱加密存儲,用到的時(shí)候再解密。文章最開始提到的簽名sign:將請求URL、時(shí)間戳、token三者合并,通過算法進(jìn)行加密處理。

最好是兩種方式結(jié)合使用。

還有一點(diǎn),在網(wǎng)絡(luò)層面上token使用明文傳輸?shù)脑捠欠浅NkU(xiǎn)的,所以一定要使用HTTPS協(xié)議。


關(guān)于我們:

Infocode藍(lán)暢信息技術(shù)有限公司成功為多家世界財(cái)富500強(qiáng)企業(yè)以及其他著名品牌提供優(yōu)質(zhì)服務(wù),是您靠譜的互聯(lián)網(wǎng)開發(fā)供應(yīng)商。

服務(wù)客戶遍及北京、上海、杭州、深圳、廣州、天津、青島、南京、寧波、蘇州、無錫、廈門、重慶、西安等大中型城市及地區(qū)    為您提供H5開發(fā)小程序開發(fā),H5外包,微信開發(fā),H5商城開發(fā),小程序商城開發(fā),網(wǎng)站開發(fā)外包,H5游戲開發(fā),小程序開發(fā)外包,小程序設(shè)計(jì)、APP開發(fā)外包,UI設(shè)計(jì),SEO優(yōu)化,SEO外包,視頻后期制作等優(yōu)質(zhì)服務(wù)



本文地址:
更多內(nèi)容推薦:
專欄最新閱讀:
更多文章閱讀請至:技術(shù)專欄
Tips: 為您提供 微信開發(fā)、H5開發(fā)、微信小程序開發(fā)、微信定制開發(fā)網(wǎng)站開發(fā)、小程序商城開發(fā)、SEO網(wǎng)站優(yōu)化視頻后期制作等定制化開發(fā)服務(wù)