OAuth2前置知識-JWT相關
什麼是jwt
jwt 名稱為 Java Web Token ,其實就是一個字串,只是它的格式是 xxxx.yyyy.zzzz。
官方解釋是這樣的:
Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源,也可以增加一些額外的其它業務邏輯所必須的宣告資訊,該token也可直接被用於認證,也可被加密。
其實就是這樣的:使用者輸入使用者名稱密碼後,認證伺服器通過使用者名稱和密碼生成一個token字串返回給瀏覽器,然後瀏覽器通過這個頭部帶著這個token就可以請求得到相應的資源了:
這是一個token的字串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJleHAiOjE2NDA2MTQ2ODgsInVzZXJfbmFtZSI6Imh4eCIsImp0aSI6IjBiNDkwYzRkLTE1N2UtNGU2MS04Mzk0LWVlNjAxOWQ4NGE3NCIsImNsaWVudF9pZCI6ImNsaWVudDEiLCJzY29wZSI6WyJhbGwiXX0. 5Vc65_KIl_2Bx_XOZPotrQxAAJWCJGHSKvXaGNH20XA
例如,我把這個xxxx.yyyy.zzzz 的字串放在 jwt官網進行解析
就可以看到如下的東東:
也就是說這樣格式的一個字串可以解析為一個json格式的物件。
那麼xxxx yyyy zzzz 分別是一些什麼?
xxxx yyyy zzzz
xxxx 稱為頭部字串
xxxx 是header
也就是上圖的
{
"alg": "HS256",
"typ": "JWT"
}
它描述的是jwt的元資料,alg表示簽名的演算法,typ表示這個令牌的型別,然後將header通過base64Url(header)就得到了xxxx字串
yyyy 稱為負載 payload字串
payload 稱為負載,也是一個json物件,一般用來存放實際的資料資訊,jwt一般有如下的欄位
{ "iss":"簽發人", "exp":"過期時間", "sub":"主題", "aud":"受眾", "nbf":"生效時間", "iat":"簽發時間", "jti":"jwt的ID,一個編號", }
然後yyyy=basey64Url(payload)。
zzzz 稱為簽名字串
簽名字串是由如下公式所得:
zzzz= HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), 'your-256-bit-secret')
your-256-bit-secret:你的祕鑰
頭部編碼加payload編碼,加上你的祕鑰通過HMACSHA256簽名演算法得到一個簽名zzzz
得到了簽名,然後 xxxx yyyy zzzz 通過“.”連線起來,就得到了一個token字串