基于Token的身份驗(yàn)證之JWT基礎(chǔ)教程
前言
初次了解JWT,很基礎(chǔ),高手勿噴。
基于Token的身份驗(yàn)證用來替代傳統(tǒng)的cookie+session身份驗(yàn)證方法中的session。
token應(yīng)用流程為:
1、初次登錄:用戶初次登錄,輸入用戶名密碼。
2、密碼驗(yàn)證:服務(wù)器從數(shù)據(jù)庫取出用戶名和密碼進(jìn)行驗(yàn)證。
3、生成JWT:服務(wù)器端驗(yàn)證通過,根據(jù)從數(shù)據(jù)庫返回的信息,以及預(yù)設(shè)規(guī)則,生成JWT。
4、返還JWT:服務(wù)器的HTTP RESPONSE中將JWT返還。
5、帶JWT的請求:以后客戶端發(fā)起請求,HTTP REQUEST HEADER中的Authorization字段都要有值,為JWT,用來驗(yàn)證用戶身份以及對路由,服務(wù)和資源的訪問權(quán)限進(jìn)行驗(yàn)證。請求驗(yàn)證的url可以例如:http://127.0.0.1:8083/change/goodsMenu? token=JWT
JWT是啥?
JWT就是一個(gè)字符串,經(jīng)過加密處理與校驗(yàn)處理的字符串,形式為:
A.B.C
A由JWT頭部信息header加密得到
B由JWT用到的身份驗(yàn)證信息json數(shù)據(jù)加密得到
C由A和B加密得到,是校驗(yàn)部分
怎樣生成A?
header格式為:
{ "typ": "JWT", "alg": "HS256" }
它就是一個(gè)json串,兩個(gè)字段是必須的,不能多也不能少。alg字段指定了生成C的算法,默認(rèn)值是HS256
將header用base64加密,得到A
通常,JWT庫中,可以把A部分固定寫死,用戶最多指定一個(gè)alg的取值
怎樣計(jì)算B?
根據(jù)JWT claim set[用base64]加密得到的。claim set是一個(gè)json數(shù)據(jù),是表明用戶身份的數(shù)據(jù),可自行指定字段很靈活,也有固定字段表示特定含義(但不一定要包含特定字段,只是推薦)。
這里偷懶,直接用php中的代碼來表示claim set了,重在說明字段含義:
$token = array( "iss" => "http://example.org", #非必須。issuer 請求實(shí)體,可以是發(fā)起請求的用戶的信息,也可是jwt的簽發(fā)者。 "iat" => 1356999524, #非必須。issued at。 token創(chuàng)建時(shí)間,unix時(shí)間戳格式 "exp" => "1548333419", #非必須。expire 指定token的生命周期。unix時(shí)間戳格式 "aud" => "http://example.com", #非必須。接收該JWT的一方。 "sub" => "jrocket@example.com", #非必須。該JWT所面向的用戶 "nbf" => 1357000000, # 非必須。not before。如果當(dāng)前時(shí)間在nbf里的時(shí)間之前,則Token不被接受;一般都會留一些余地,比如幾分鐘。 "jti" => '222we', # 非必須。JWT ID。針對當(dāng)前token的唯一標(biāo)識 "GivenName" => "Jonny", # 自定義字段 "Surname" => "Rocket", # 自定義字段 "Email" => "jrocket@example.com", # 自定義字段 "Role" => ["Manager", "Project Administrator"] # 自定義字段 );
JWT遵循RFC7519,里面提到claim set的json數(shù)據(jù)中,自定義字段的key是一個(gè)string,value是一個(gè)json數(shù)據(jù)。因此隨意編寫吧,很靈活。
個(gè)人初學(xué),認(rèn)為一個(gè)最基本最簡單最常用的claim set為:
$token=array( "user_id" => 123456, #用戶id,表明用戶 "iat" => 1356999524, #token發(fā)布時(shí)間 "exp" => 1556999524, #token過期時(shí)間 );
將claim set加密后得到B,學(xué)名payload
怎樣計(jì)算C?
將A.B使用HS256加密(其實(shí)是用header中指定的算法),當(dāng)然加密過程中還需要密鑰(自行指定的一個(gè)字符串)。
加密得到C,學(xué)名signature,其實(shí)就是一個(gè)字符串。作用類似于CRC校驗(yàn),保證加密沒有問題。
好了,現(xiàn)在A.B.C就是生成的token了。
怎樣使用token?
可以放到HTTP請求的請求頭中,通常是Authorization字段。
也有人說放到cookie。不過移動端app用cookie似乎不方便。
token應(yīng)用流程?
初次登錄:用戶初次登錄,輸入用戶名密碼
密碼驗(yàn)證:服務(wù)器從數(shù)據(jù)庫取出用戶名和密碼進(jìn)行驗(yàn)證
生成JWT:服務(wù)器端驗(yàn)證通過,根據(jù)從數(shù)據(jù)庫返回的信息,以及預(yù)設(shè)規(guī)則,生成JWT
返還JWT:服務(wù)器的HTTP RESPONSE中將JWT返還
帶JWT的請求:以后客戶端發(fā)起請求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,為JWT
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
mapboxgl?中插值表達(dá)式的應(yīng)用場景分析
interpolate是mapboxgl地圖樣式中用于插值的表達(dá)式,能對顏色和數(shù)字進(jìn)行插值,這篇文章就把?mapboxgl?中interpolate插值工具的常見應(yīng)用場景介紹一下,感興趣的朋友一起看看吧2022-09-09Git Submodule管理項(xiàng)目子模塊的使用
這篇文章主要介紹了Git Submodule管理項(xiàng)目子模塊的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08