Django下JWT的使用


前言

  JWT 是 json web token 的縮寫, token的作用你應該已經了解,用於識別用戶身份避免每次請求都需要驗證

    用來解決前后端分離時的用戶身份驗證

  在傳統的web項目中 我們會在form表單中設置隱藏字段來提交token信息

  但是在前后端分離時,我們就無法像網頁一樣直接放在表單里,

  需要前后端的配合才能完成token的驗證

簡單使用:

下面是使用itsdangerous模塊實現JWT的生成與解析

import hashlib,time
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 用一個值作為密鑰 當然你可以用任何的字符串作為密鑰 越復雜越安全
secret_key = "548D859ADA8B084E76730CCEFA052EE1"
# 除去密鑰外 再添加一個鹽值來提高安全性
salt_str = "this is salt string"
expires_in = 3600 # 控制token的有效時長 默認為3600秒
# 實例化對應的對象傳入兩個參數,一個空的token就產生了,但是我們要用token來識別用戶身份
# 你當然可以把token和用戶的身份信息存到數據庫做對應
# 但是jwt已經考慮到了,所以你只需要在dump中添加用於識別用戶身份的數據即可
# 后期當用戶請求到達時,使用同樣的方法反解就能獲取到token中包含的數據
# 從而完成用戶身份的識別
s = Serializer(secret_key=secret_key,expires_in=expires_in,salt=salt_str,)
# 獲取token並在其中寫入用戶的身份信息
# s.dump() # 將token寫入指定文件 與json的dump意思相同
# 得到最后的token數據 分返回類型為字節 所以做一個解碼
# iat字段來自官方文檔 用於表示token的過期時間,用於客戶端做判斷,不是必須的
# 另外兩個字段是自己定義的
token = s.dumps({
    "uer_id":"100001",
    "role_id":"2",
    "iat":time.time(),
}). decode("utf-8")
# 得到token 在用戶登錄成功時返回給客戶端
print(token)
# 客戶端利用任何手段來存儲token值,在請求數據時帶上token一起請求
# =======================================================================
# 當客戶端帶上token來請求時我們需要從中獲取用戶的身份信息
# 解析token時可能會發生異常,常見的如token過期,或token被篡改等等..
# 服務器需要做相應的檢查
 
代碼實現
服務器端代碼:

文件:test/views.py

from django.http import JsonResponse
from test1 import jwt_tool
​
# 登錄接口
def login(req):
    username = req.POST.get("username")
    password = req.POST.get("password")
    # 模擬登錄
    if username == "jerry" and password == "123":
        # 用戶標識id
        info = {"user_id":"10086"}
        #生成token
        token = jwt_tool.gen_token(info)
        # 返回數據
        data = {"msg":"登錄成功!","token":token,"code":1}
        return JsonResponse(data, safe=False)
    else:
        return JsonResponse({"msg":"登錄失敗!","code":-1}, safe=False,)
      
# 用於請求json數據的接口
def get_some_data(req):
    try:
    # 獲取token
        token = req.META["HTTP_TOKEN"]
        print(token)
    except:
        return JsonResponse({"msg": "缺少token!"}, safe=False)
​
    # 解析token獲取用戶身份信息
    res = jwt_tool.parser_token(token)
    if res["code"] == 1:
        user_id = res["data"]["user_id"]
        return JsonResponse({"msg": "您的id為:%s" % user_id,"data":"一些數據!"}, safe=False)
    else:
        return JsonResponse({"msg": "身份驗證失敗 請重新登錄!"}, safe=False)
 
文件:client_test.py
 
import requests
​
# 模擬登錄
resp = requests.post("http://127.0.0.1:8000/login/",data={"username":"jerry","password":"123"})
res = resp.json()
​
# 取出返回的token
token = None
if res["code"] == 1:
    print("登錄成功!")
    token = res["token"]
else:
    print("登錄失敗!")
​
# 請求數據接口
resp1 = requests.get("http://127.0.0.1:8000/get_some_data/",headers={"token":token})
print(resp1.json())

 


免責聲明!

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



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