初次瞭解JWT,很基礎,高手勿噴。
基於Token的身份驗證用來替代傳統的cookie+session身份驗證方法中的session。php
JWT就是一個字符串,通過加密處理與校驗處理的字符串,形式爲:html
A.B.C算法
A由JWT頭部信息header加密獲得
B由JWT用到的身份驗證信息json數據加密獲得
C由A和B加密獲得,是校驗部分數據庫
header格式爲:json
{ "typ": "JWT", "alg": "HS256" }
它就是一個json串,兩個字段是必須的,不能多也不能少。alg
字段指定了生成C的算法,默認值是HS256
將header用base64加密,獲得A
一般,JWT庫中,能夠把A部分固定寫死,用戶最多指定一個alg
的取值服務器
根據JWT claim set[用base64]加密獲得的。claim set是一個json數據,是代表用戶身份的數據,可自行指定字段很靈活,也有固定字段表示特定含義(但不必定要包含特定字段,只是推薦)。
這裏偷懶,直接用php中的代碼來表示claim set了,重在說明字段含義:cookie
$token = array( "iss" => "http://example.org", #非必須。issuer 請求實體,能夠是發起請求的用戶的信息,也但是jwt的簽發者。 "iat" => 1356999524, #非必須。issued at。 token建立時間,unix時間戳格式 "exp" => "1548333419", #非必須。expire 指定token的生命週期。unix時間戳格式 "aud" => "http://example.com", #非必須。接收該JWT的一方。 "sub" => "jrocket@example.com", #非必須。該JWT所面向的用戶 "nbf" => 1357000000, # 非必須。not before。若是當前時間在nbf裏的時間以前,則Token不被接受;通常都會留一些餘地,好比幾分鐘。 "jti" => '222we', # 非必須。JWT ID。針對當前token的惟一標識 "GivenName" => "Jonny", # 自定義字段 "Surname" => "Rocket", # 自定義字段 "Email" => "jrocket@example.com", # 自定義字段 "Role" => ["Manager", "Project Administrator"] # 自定義字段 );
JWT遵循RFC7519,裏面提到claim set的json數據中,自定義字段的key是一個string,value是一個json數據。所以隨意編寫吧,很靈活。session
我的初學,認爲一個最基本最簡單最經常使用的claim set爲:app
$token=array( "user_id" => 123456, #用戶id,代表用戶 "iat" => 1356999524, #token發佈時間 "exp" => 1556999524, #token過時時間 );
將claim set加密後獲得B
,學名payload
加密
將A.B
使用HS256加密(實際上是用header中指定的算法),固然加密過程當中還須要密鑰(自行指定的一個字符串)。
加密獲得C
,學名signature
,其實就是一個字符串。做用相似於CRC校驗,保證加密沒有問題。
好了,如今A.B.C
就是生成的token了。
能夠放到HTTP請求的請求頭中,一般是Authorization
字段。
也有人說放到cookie。不過移動端app用cookie彷佛不方便。