JWT

官網

json web token,一般用於用戶認證(前後端分離、app 開發)

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

基於傳統的 token 認證

  • 用戶登陸,服務端給返回 token,並將 token 保存在服務端,以後用戶在來訪問時,需要攜帶 token,服務端獲取 token 後,再去數據庫中獲取 token 進行校驗

基於 jwt

  • 用戶登陸,服務端給用戶返回一個 token(服務端不保存),以後用戶在來訪問,需要攜帶 token,服務端獲取 token 後,在做 token 的校驗
  • 優勢在於,相較於傳統的 token 相比,他無須再服務端保存 token

實現過程

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  1. 用戶提交用戶名和密碼給服務端,如果登陸成功,使用 jwt 創建一個 token,並返回給用戶
    ​​​​eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    

    注意:jwt 生成的 token 是由三段字符串組成,並且用 . 連接起來

    • 第一段字符串,HEADER,內部包含算法和token 類型。json 轉化成字符串,然後做 base64url(可以反解回來) 加密(先取的 base64 再把裡面的一些符號用其他符號代替,像 + 替換成 _)
      ​​​​​​​​{
      ​​​​​​​​    "alg": "HS256",
      ​​​​​​​​    "typ": "JWT"
      ​​​​​​​​}
      
    • 第二段字符串,payload,自定義值(隨你高興寫啥,不用按照下面)。json 轉化成字符串,然後做 base64url(可以反解回來) 加密(先取的 base64 再把裡面的一些符號用其他符號代替,像 + 替換成 _)
      ​​​​​​​​{
      ​​​​​​​​    "UID": "1234567890",
      ​​​​​​​​    "name": "John Doe",
      ​​​​​​​​    "iat": 1516239022   # 超時時間
      ​​​​​​​​}
      
    • 第三段字符串,第一、二部分的密文拼接起來,對前 2 部分密文進行 HS256 加密 + 加鹽,在對 HS256 加密後的密文做 base64url 加密
  2. 以後用戶在來訪問時,需要攜帶 token,後端需要對 token 進行校驗
    • 獲取 token
    • 第一步,對 token 進行切割
    • 第二步,對第二段進行 base64url 解密,並獲取 payload 信息,並檢測 token 是否已超時
    • 第三步,把第 1,2 段拼接,再次執行 HS256 加密

      密文 = base64解密(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c),相等則表示 token 未被修改過,認證通過

  3. 應用
pip install pyjwt