# JWT [官網](https://jwt.io/) json web token,一般用於用戶認證(前後端分離、app 開發) ![](https://i.imgur.com/LOUvO85.png) 基於傳統的 token 認證 - 用戶登陸,服務端給返回 token,並將 token 保存在服務端,以後用戶在來訪問時,需要攜帶 token,服務端獲取 token 後,再去數據庫中獲取 token 進行校驗 基於 jwt - 用戶登陸,服務端給用戶返回一個 token(服務端不保存),以後用戶在來訪問,需要攜帶 token,服務端獲取 token 後,在做 token 的校驗 - 優勢在於,相較於傳統的 token 相比,他無須再服務端保存 token # 實現過程 ![](https://i.imgur.com/jc4g1Ol.png) 1. 用戶提交用戶名和密碼給服務端,如果登陸成功,使用 jwt 創建一個 token,並返回給用戶 ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` > 注意:jwt 生成的 token 是由三段字符串組成,並且用 ```.``` 連接起來 - 第一段字符串,HEADER,內部包含算法和token 類型。json 轉化成字符串,然後做 ```base64url```(可以反解回來) 加密(先取的 ```base64``` 再把裡面的一些符號用其他符號代替,像 ```+``` 替換成 ```_```) ```json { "alg": "HS256", "typ": "JWT" } ``` - 第二段字符串,payload,自定義值(隨你高興寫啥,不用按照下面)。json 轉化成字符串,然後做 ```base64url```(可以反解回來) 加密(先取的 ```base64``` 再把裡面的一些符號用其他符號代替,像 ```+``` 替換成 ```_```) ```json { "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 ```