JWT token 前端解碼
JWT全稱為json web token,他的本質是一個對JSON對象加密后的字符串,當服務器認證通過后一個包含用戶信息的josn對象,返給用戶,典型的JWT由三個部分組成,每一個部分由點(.)分隔,這樣就構成JWT,
例子如下:header.payload.signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ (三種不同的信息)
第一部分:紅色 我們稱他為頭部(header)
第二部分:綠色 我們稱它為載荷(payload) ---------這部分為后端JAVA為我們加密后的數據,我們需要在前端將第二段數據分割出來,然后再去解析他
第三部分:藍色 我們稱它為簽證(signature)
頭部 Header:
頭部包含所使用的簽名算法和令牌的類型(即JWT),這部分會被編碼為Base64URL格式。Header部分主要存儲關於簽名算法的信息,通常不包含兩個部分:token類型和采用的加密算法,大致源內容如下:
{ "alg": "HS256", "typ": "JWT"} ,然后使用Base64Url編碼組成了Header部分,結果大致如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。
載荷 Payload:
載荷嘛,就是裝東西的,在我們行業來說,裝的就是數據啦,他是一個數據實體,他默認這一部分數據是業務數據,可有可無,可多可少,嘿嘿 ,你說了算!!!一般在不修改數據的情況下,主要包含以下幾部分:iss(簽發者),exp(過期時間戳), sub(面向的用戶), aud(接收方), iat(簽發時間),大致的源樣式是這樣:
{ {name: "劉鑫", virtualPhone: ""}},經過Base64Url 編碼以后,會變成JWT的第二部分字符串:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9。
也說過了,這一部分就是我們想獲取到的數據,主要解析方法為:
let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ' 獲取token
let user = decodeURIComponent(escape(window.atob(msg.split('.')[1]))) 將JWT切割 獲取需要的載荷
let res = JSON.parse(user).name 將獲取的字符串轉換成JSON對象
let res = JSON.parse(user).virtualPhone 獲取需要的數據
轉換結果如下 有圖有真相:
(emmmm,有的數據是空的~)
上面提到了window.atob()這個函數,不知道大家有沒有關注過,這個函數呢,,,emmmm 主要是用於解碼使用 base-64 編碼的字符串,base64編碼的使用方法就是btoa(),而用於解碼的使用方法是atob(),
而base64 又是什么呢? Base64是一種基於64個可打印字符來表示二進制數據的表示方法,就是一種編碼轉換方式,
將ASCII
字符轉換成普通文本, 是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一。base64
由字母a-z
、A-Z
、0-9
以及+
和/
, 再加上作為墊字的=
, 一共65字符組成一個基本字符集, 其他所有字符都可以根據一定規則, 轉換成該字符集中的字符。
我們在寫app的時候,因為使用了uni-app框架,uni-app這個框架不支持安裝包,這個base64其實是有源碼js的,但是因為不支持安裝,所以只能直接扒了,其實也很簡單,可以直接在網上尋找一個源碼包,然后在你需要用的組件中直接引入就好了
引入文件:
//引入Base64解碼
import {Base64} from "../../static/js/jwt.js"
解密:
//解密token
let b64 = Base64.decode(token)
這樣就解密完成了,可以獲取到我們相用的數據了,注意一下類型就好~~~~ 另外附加~~~ 加密為 :let b64 = Base64.encode(token)
簽名 signature:Signature部分是對前兩部分的防篡改簽名。將Header和Payload用Base64URL編碼后,再用點(.)連接起來。然后使用簽名算法和密鑰對這個字符串進行簽名
signature = hmac_sha256(base64encode(header) + '.' + base64encode(payload), 'MY_SUPER_SECRET_KEY')
這個密鑰(MY_SUPER_SECRET_KEY)只有服務器才知道,不能泄露給用戶。
簽名信息:TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
綜上就組成了一個完整的JWTheader.payload.signature:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
到此結束~~~ 如果有不足的 還請各位大佬糾正~