全稱:json web token
解釋:加密字串的原始資料是json,後台產生,通過web傳輸給前台儲存
格式:三段式 - 頭.載荷.簽名 - 頭和載荷用的是base64可逆加密,簽名用md5不可逆加密
內容:頭(基礎資訊,也可以為空):加密方式、公司資訊、專案組資訊、...
載荷(核心資訊):使用者資訊、過期時間、...
簽名(安全保障):頭加密結果+載荷加密結果+伺服器秘鑰 的md5加密結果
認證規則:
後台一定要保障 伺服器秘鑰 的安全性(它是jwt的唯一安全保障)
後台簽發token(login介面 ) -> 前台儲存 -> 傳送需要認證的請求帶著token -> 後台校驗得到合法的使用者 -> 許可權管理
為什麼要有jwt認證:
1)伺服器壓力小, 後台不需要儲存token,只需要儲存簽發與校驗token的演算法,效率遠遠大於後台儲存和取出token完成校驗
2) jwt演算法認證,更適合伺服器集群部署
安裝:pip install djangorestframework-jwt
模組包:rest_framework_jwt
採用drf-jwt框架,後期任務只需要書寫登入
為什麼要重寫登入:drf-jwt只完成了賬號密碼登入,我們還需要手機登入,郵箱登入
為什麼不需要重寫認證類:因為認證規則已經完成且固定不變,變得只有認證字串的字首,字首可以在配置檔案中配置
jwt配置;
在settings.py檔案中配置,如果不配置,預設走jwt預設的
jwt外掛程式的三個介面:
在urls.py中配置
在postman中測試一下簽發token
注意:上面三個介面都是傳送post請求
注:apiresponse 為自定義response物件
# views.py
from rest_framework.views import apiview
from . import models,serializers
from utils.response import apiresponse
class loginapiview(apiview):
# 登入介面應該禁用所有的認證和、許可權,因為不管是誰都應該能進來
authentication_classes =
permission_classes =
def post(self, request, *args, **kwargs):
# 將資料傳到序列化元件進行校驗
user_ser = serializers.loginserializer(data=request.data)
user_ser.is_valid(raise_exception=true)
return apiresponse(msg='login success', data=)
注意:
通過user物件生成payload載荷
payload = jwt_payload_handler(user)
通過payload簽發token
token = jwt_encode_handler(payload)
# serializer.py
from rest_framework.serializers import modelserializer, charfield, validationerror, serializermethodfield
from . import models
from django.contrib.auth import authenticate
import re
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
class loginserializer(modelserializer):
username = charfield(write_only=true)
password = charfield(write_only=true)
class meta:
model = models.user
fields = ('username', 'password')
def validate(self, attrs):
# user_obj = authenticate(**attrs)
# if not user_obj:
# raise validationerror('使用者名稱或密碼錯誤')
# 賬號密碼登入 ==》 多方式登入
user = self._many_method_login(**attrs)
# 通過user物件生成payload載荷
payload = jwt_payload_handler(user)
# 通過payload簽發token
token = jwt_encode_handler(payload)
# 將user和token存放在序列化物件中,方便返回到前端去
self.user = user
self.token = token
return attrs
# 多方式登入 (使用者名稱、郵箱、手機號三種方式登入)
def _many_method_login(self, **attrs):
username = attrs.get('username')
password = attrs.get('password')
# 利用正則匹配判斷使用者輸入的資訊
# 1.判斷郵箱登入
if re.match(r'.*@.*', username):
user = models.user.objects.filter(email=username).first() # type: models.user
# 2.判斷手機號登入
elif re.match(r'^1[3-9][0-9]$',username):
user = models.user.objects.filter(mobile=username).first()
# 3.使用者名稱登入
else:
user = models.user.objects.filter(username=username).first()
if not user:
raise validationerror()
if not user.check_password(password):
raise validationerror()
return user
使用postman測試**:
1)任何人都能直接訪問的介面
請求不是是get、還是post等,不需要做任何校驗
2)必須登入後才能訪問的介面
任何請求方式都可能做該方式的限制,請求必須在請求頭中攜帶認證資訊 - authorization
3)前台的認證資訊獲取只能通過登入介面
前台提供賬號密碼等資訊,去後台換認證資訊token
4)前台如何完成登入登出
前台登入成功一般在cookie中儲存認證資訊token,分離登出就是前台主動清除儲存的token資訊
"""
DRF的JWT使用者認證
目錄jwt的使用 從根本上來說,jwt是一種開放的標準 rfc 7519 全稱為json web token 其存在的意義在於,對於前後端分離的專案來說,後端不需要儲存token,主需要儲存簽發和校驗token的演算法,所以我們需要在前端儲存token,然後通過jwt加密之後傳送給後端,從而完成校驗...
drf 認證元件
目錄區域性使用 全域性使用 原始碼分析 使用場景 有些介面在進行訪問時,需要確認使用者是否已經登入,比如 使用者需要購買物品時,在結賬的時候,就需要進行登入驗證的。一般使用者認證都是基於角色認證 使用者表關聯角色表,角色表關聯許可權表 五表機制 使用者表與角色表多對多 角色表與許可權表多對多 dja...
drf 三大認證之 認證元件
原始碼分析 1 apiview的dispath self,request,args,kwargs 2 dispath方法內 self.initial request,args,kwargs 進入三大認證 認證元件 校驗使用者 遊客 合法使用者 非法使用者 非法使用者 代表校驗失敗,丟擲異常,返回40...