JWT 使用Base-64解碼前端 token


 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-zA-Z0-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

到此結束~~~   如果有不足的 還請各位大佬糾正~

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM