Django token 生成與驗(yàn)證的實(shí)現(xiàn)
首先創(chuàng)建一個(gè)Django 項(xiàng)目,我這里以 demo為例,作為示例先不創(chuàng)建app了

然后再 demo 目錄下創(chuàng)建 views.py 和 utils 目錄,在目錄下分別創(chuàng)建 token.py ,middleware.py ,__init__.py,然后目錄格式如下圖

接下來(lái)完成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 獲取過(guò)期時(shí)間"""
payload = get_payload(token)
return payload['exp']
def check_token(username, token):
"""驗(yàn)證 token: 檢查 username 和 token 是否一致且未過(guò)期"""
return get_username(token) == username and get_exp_time(token) > (datetime.utcnow() + timedelta(hours=8)).strftime('%Y-%m-%d')接著是 middleware.py 文件,記得配置 路由白名單,即不需要驗(yàn)證 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
# 白名單,表示請(qǐng)求里面的路由時(shí)不驗(yàn)證登錄信息
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:
# 從請(qǐng)求頭中獲取 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ù)驗(yàn)證
if check_token(username, token):
pass
else:
return JsonResponse({"code": -2, "msg": "登錄信息錯(cuò)誤或已過(guò)期"})接著是 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è)置一下請(qǐng)求路徑
from django.urls import path
from demo import views
urlpatterns = [
path('index/', views.index),
]接著再 settings.py 文件中 設(shè)置我們的中間件,這樣每次請(qǐng)求都會(huì)先校驗(yàn) token 了
MIDDLEWARE = [
'demo.utils.middleware.AuthorizeMiddleware', # 一定要放在最上面,有cors的話放cors下面
'···',
]到這為止 就已經(jīng)完成了所有的配置,下面圖1 和圖2分別是 設(shè)置和沒(méi)設(shè)置請(qǐng)求路徑白名單的效果

圖1 - 沒(méi)有設(shè)置路由白名單

圖2 - 設(shè)置了路由白名單
- Django JWT Token RestfulAPI用戶認(rèn)證詳解
- django基于存儲(chǔ)在前端的token用戶認(rèn)證解析
- 在django中使用post方法時(shí),需要增加csrftoken的例子
- 解決Django提交表單報(bào)錯(cuò):CSRF token missing or incorrect的問(wèn)題
- Django前后端分離csrf token獲取方式
- Django基于Token的驗(yàn)證使用的實(shí)現(xiàn)
- django restframework使用redis實(shí)現(xiàn)token認(rèn)證
- Vue?和?Django?實(shí)現(xiàn)?Token?身份驗(yàn)證的流程
- django如何設(shè)置csrf_token
- django應(yīng)用JWT(JSON?Web?Token)實(shí)戰(zhàn)教程
- Django實(shí)現(xiàn)接口token檢測(cè)的方法詳解
相關(guān)文章
基于python中pygame模塊的Linux下安裝過(guò)程(詳解)
下面小編就為大家?guī)?lái)一篇基于python中pygame模塊的Linux下安裝過(guò)程(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
分布式全文檢索引擎ElasticSearch原理及使用實(shí)例
這篇文章主要介紹了分布式全文檢索引擎ElasticSearch原理及使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python和OpenCV進(jìn)行指紋識(shí)別與驗(yàn)證的實(shí)現(xiàn)
本文主要介紹了Python和OpenCV進(jìn)行指紋識(shí)別與驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Python 實(shí)現(xiàn)自動(dòng)導(dǎo)入缺失的庫(kù)
這篇文章主要介紹了Python 實(shí)現(xiàn)自動(dòng)導(dǎo)入缺失的庫(kù),解決導(dǎo)入 Python 庫(kù)失敗的問(wèn)題,本文分三種情況給大家介紹,需要的朋友可以參考下2019-10-10
Python字符串操作strip()和split()方法詳解
這篇文章主要介紹了Python中的strip()和split()方法,講解了它們的使用場(chǎng)景和典型用法,并展示了一些示例代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
python實(shí)現(xiàn)的爬取電影下載鏈接功能示例
這篇文章主要介紹了python實(shí)現(xiàn)的爬取電影下載鏈接功能,涉及Python基于BeautifulSoup模塊的網(wǎng)頁(yè)信息爬取相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
python操作Excel神器openpyxl看這一篇就夠了
Python使用openpyxl讀寫excel文件這是一個(gè)第三方庫(kù),可以處理xlsx格式的Excel文件,下面這篇文章主要給大家介紹了關(guān)于python操作Excel神器openpyxl的相關(guān)資料,需要的朋友可以參考下2023-04-04
sklearn的predict_proba使用說(shuō)明
這篇文章主要介紹了sklearn的predict_proba使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06

