drf元件之jwt認證

2022-01-22 04:04:25 字數 4044 閱讀 1212

全稱: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...