JWT(JSON Web Token),本質就是一個字符串書寫規范,如下圖,作用就是在用來用戶和服務器之間傳遞安全可靠的信息。
在目前前後端分離的開發過程中,使用token鑒權機制用於身份驗證是最常見的方案,流程如下:
服務器當驗證用戶賬號和密碼正確的時候,給用戶頒發一個令牌,這個令牌作為後續用戶訪問一些接口的憑證。
後續訪問會根據這個令牌判斷用戶是否有權限進行訪問。
Token分為三部分,頭部(header)、載荷(Payload)、簽名(Signature),並以.進行拼接。其中頭部和載荷都是以JSON格式存放數據,只是進行了編碼。
Header,每個JWT都會帶有頭部信息,這裡主要聲明使用的算法。聲明算法的字段名為alg,同時還有一個typ的字段,默認為JWT即可,以下示例中算法HS256。
{ "alg": "HS256", "typ": "JWT" }
因為JWT是字符串,所以我們還需要對以上內容進行Base64編碼,編碼後的字符串如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload,載荷即消息體,這裡會存放實際的內容,也就是Token的數據聲明,例如用戶的id和name,默認情況下也會攜帶令牌的簽發時間iat,通過還可以設置過期時間,如下:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
同樣進行Base64編碼後,字符串如下:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature,簽名是對頭部和載荷內容進行簽名,一般情況,設置一個secretKey,對前兩個的結果進行HMACSHA25算法,公式如下:
Signature = HMACSHA256(base64Url(header)+.+base64Url(payload),secretKey)
如何實現?Token的生成分為兩個部分:生成token,登錄成功的時候,頒發token。驗證token,訪問某些資源或者接口的時候,驗證token。