先了解下幾個名詞:
- UUID:通用唯一識別碼,絕對不會重復的字符串。不同版本UUID的區(qū)別。
傳統(tǒng)的基于token的認證
眾所周知,在用戶登錄驗證時,服務端驗證用戶名密碼是否正確,如果驗證通過,則生成一個token發(fā)送給用戶,同時保存這個token到數(shù)據(jù)庫。
JWT
用戶登錄,服務端返回一個token,但是服務端不保存這個token。
以后用戶再來訪問,需要攜帶token,服務端基于算法校驗token。
JWT實現(xiàn)過程
看一下一個JWT長什么樣(這是一句,由3段組成,中間小數(shù)點隔開,為了直觀,我在小數(shù)點處換行)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT-示例.png
第1、2段是通過base64url編碼的,base64url解碼結果如下:
atob('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9')
得到 "{"alg":"HS256","typ":"JWT"}"
atob('eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ')
得到 "{"sub":"1234567890","name":"John Doe","iat":1516239022}"
第3段就有些不同,它的生成步驟如下:
將第1、2段拼接起來;
將拼接結果進行加密,加密方法看第一段中有寫,這里是HS256,可以加鹽;
對HS256加密后的密文再進行base64url編碼。

JWT-第三段.png
校驗流程
用戶再訪問時,如何校驗JWT?
1. 獲取token
從請求體中取出token。
2. 切割token,進行base64url解碼,獲取信息
從header(第1段)中得到加密算法類型,這里假設是HS256。
從payload(第2段),一般我們在最初生成token時會帶上token的過期時間戳,這里我們檢查下過期了沒,如果過期了則直接拒絕請求。
3. 校驗token是否有效
第3段是用來校驗token的,我們把進行
HS256(
base64Url編碼(header) + '.' +
base64Url編碼(payload),
我加的鹽
)
理論上得到的結果應該與第3段完全一致,如果不一致則說明token無效,拒絕請求。