Django token 生成與驗證的實現(xiàn)
首先創(chuàng)建一個Django 項目,我這里以 demo為例,作為示例先不創(chuàng)建app了
然后再 demo 目錄下創(chuàng)建 views.py 和 utils 目錄,在目錄下分別創(chuàng)建 token.py ,middleware.py ,__init__.py,然后目錄格式如下圖
接下來完成views.py 和 token.py 和 middleware.py 中的內(nèi)容了,首先是 token.py
import time import hashlib from demo import settings from django.core import signing from datetime import datetime, timedelta HEADER = {'typ': 'JWP', 'alg': 'default'} KEY = settings.SECRET_KEY SALT = "ESS" def encrypt(obj): """加密: signing 加密 and Base64 編碼""" value = signing.dumps(obj, key=KEY, salt=SALT) value = signing.b64_encode(value.encode()).decode() return value def decrypt(src): """解密: Base64 解碼 and signing 解密""" src = signing.b64_decode(src.encode()).decode() raw = signing.loads(src, key=KEY, salt=SALT) return raw def create_token(username): """生成token信息""" # 1. 加密頭信息 header = encrypt(HEADER) # 2. 構(gòu)造Payload(有效期31天) payload = { "username": username, "iat": time.time(), "exp": (datetime.utcnow() + timedelta(hours=8,days=31)).strftime("%Y-%m-%d") } payload = encrypt(payload) # 3. MD5 生成簽名 md5 = hashlib.md5() md5.update(("%s.%s" % (header, payload)).encode()) signature = md5.hexdigest() token = "%s.%s.%s" % (header, payload, signature) return token def get_payload(token): """解析 token 獲取 payload 數(shù)據(jù)""" payload = str(token).split('.')[1] payload = decrypt(payload) return payload def get_username(token): """解析 token 獲取 username""" payload = get_payload(token) return payload['username'] def get_exp_time(token): """解析 token 獲取過期時間""" payload = get_payload(token) return payload['exp'] def check_token(username, token): """驗證 token: 檢查 username 和 token 是否一致且未過期""" return get_username(token) == username and get_exp_time(token) > (datetime.utcnow() + timedelta(hours=8)).strftime('%Y-%m-%d')
接著是 middleware.py 文件,記得配置 路由白名單,即不需要驗證 token 的路由
from .token import check_token from django.http import JsonResponse try: from django.utils.deprecation import MiddlewareMixin # Django 1.10.x except ImportError: MiddlewareMixin = object # 白名單,表示請求里面的路由時不驗證登錄信息 API_WHITELIST = ['/index/', '/index', 'index/'] class AuthorizeMiddleware(MiddlewareMixin): def process_request(self, request): print(request.path) print(request.path not in API_WHITELIST) if request.path not in API_WHITELIST: if "sites" in request.path: pass else: # 從請求頭中獲取 username 和 token username = request.META.get("HTTP_USERNAME") token = request.META.get("HTTP_AUTHORIZATION") if username is None or token is None: return JsonResponse({"code": -2, "msg": "未查詢到登錄信息"}) else: # 調(diào)用 check_token 函數(shù)驗證 if check_token(username, token): pass else: return JsonResponse({"code": -2, "msg": "登錄信息錯誤或已過期"})
接著是 views.py
from django.http import JsonResponse from demo.utils.token import create_token def index(request): return JsonResponse({'code': 0, 'message': 'Hello, world!'})
接著是 url.py,需要設(shè)置一下請求路徑
from django.urls import path from demo import views urlpatterns = [ path('index/', views.index), ]
接著再 settings.py 文件中 設(shè)置我們的中間件,這樣每次請求都會先校驗 token 了
MIDDLEWARE = [ 'demo.utils.middleware.AuthorizeMiddleware', # 一定要放在最上面,有cors的話放cors下面 '···', ]
到這為止 就已經(jīng)完成了所有的配置,下面圖1 和圖2分別是 設(shè)置和沒設(shè)置請求路徑白名單的效果
圖1 - 沒有設(shè)置路由白名單
圖2 - 設(shè)置了路由白名單
- Django JWT Token RestfulAPI用戶認證詳解
- django基于存儲在前端的token用戶認證解析
- 在django中使用post方法時,需要增加csrftoken的例子
- 解決Django提交表單報錯:CSRF token missing or incorrect的問題
- Django前后端分離csrf token獲取方式
- Django基于Token的驗證使用的實現(xiàn)
- django restframework使用redis實現(xiàn)token認證
- Vue?和?Django?實現(xiàn)?Token?身份驗證的流程
- django如何設(shè)置csrf_token
- django應用JWT(JSON?Web?Token)實戰(zhàn)教程
- Django實現(xiàn)接口token檢測的方法詳解
相關(guān)文章
基于python中pygame模塊的Linux下安裝過程(詳解)
下面小編就為大家?guī)硪黄趐ython中pygame模塊的Linux下安裝過程(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Python和OpenCV進行指紋識別與驗證的實現(xiàn)
本文主要介紹了Python和OpenCV進行指紋識別與驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03Python字符串操作strip()和split()方法詳解
這篇文章主要介紹了Python中的strip()和split()方法,講解了它們的使用場景和典型用法,并展示了一些示例代碼,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-03-03python操作Excel神器openpyxl看這一篇就夠了
Python使用openpyxl讀寫excel文件這是一個第三方庫,可以處理xlsx格式的Excel文件,下面這篇文章主要給大家介紹了關(guān)于python操作Excel神器openpyxl的相關(guān)資料,需要的朋友可以參考下2023-04-04