DRF的JWT使用者認證

2022-04-26 06:28:27 字數 3673 閱讀 5753

目錄jwt的使用

從根本上來說,jwt是一種開放的標準(rfc 7519), 全稱為json web token ,其存在的意義在於,對於前後端分離的專案來說,後端不需要儲存token,主需要儲存簽發和校驗token的演算法,所以我們需要在前端儲存token,然後通過jwt加密之後傳送給後端,從而完成校驗.

jwt演算法認證的最大優點在於適合伺服器集群部署,這樣對於比較大的專案可以從根本上提公升併發量.

jwt的格式是三段式,即header(頭) . payload(負載) . signature(簽名),其中頭和載負載採用的是base64可逆的加密,簽名採用的則是md5不可逆的加密,具體如下:

我們的後台一定要保證伺服器秘鑰的安全,因為在jwt裡面伺服器秘鑰是唯一的安全保障

後台簽發token -> 前台儲存 -> 前台想後台傳送需要認證的請求且攜帶token -> 後台校驗token得到合法的使用者

# 在cmd或者terminal視窗中:

pip install djangorestframework-jwt

# 模組包名為rest_framework_jwt

jwt最常用的是三個介面,簽發token,校驗token以及重新整理token,我們可以分別在urls.py裡面匯入

# /urls.py

from django.conf.urls import url

from . import views

from rest_framework_jwt.views import obtainjsonwebtoken, obtain_jwt_token, verify_jwt_token, refresh_jwt_token

urlpatterns = [

# drf-jwt三個檢視介面

url(r'^login/$', obtain_jwt_token),

url(r'^verify/$', verify_jwt_token),

url(r'^refresh/$', refresh_jwt_token),

]# 匯入之後,我們還需要在settings.py裡面配置相關的jwt的配置項

# /settings.py

import datetime

jwt_auth =

下面我們就用**來實現jwt的整個邏輯,大概邏輯如下:

檢視類中,將請求資料交給序列化完成校驗,然後返回使用者資訊和對應token

序列化類,自定義反序列化的字段,利用全域性鉤子校驗資料得到user和token,並且儲存在序列化類物件中

token可以採用jwt外掛程式的rest_framework_jwt.serializers中jwt_payload_handler,jwt_encode_handler來完成簽發

下面我們做乙個例項,該小例子實現了使用者的多方式登入:

# urls.py

from django.conf.urls import url

from . import views

urlpatterns = [

url(r'^login/$', views.loginapiview.as_view())

]# serializers.py

from rest_framework.serializers import modelserializer, charfield, validationerror, serializermethodfield

from . import models

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')

# 在全域性鉤子中簽發token

def validate(self, attrs):

user = self._many_method_login(**attrs)

# 將資料存放到序列化物件中

payload = jwt_payload_handler(user)

token = jwt_encode_handler(payload)

self.user = user

self.token = token

return attrs

# 多方式登入

def _many_method_login(self, **attrs):

username = attrs.get('username')

password = attrs.get('password')

# 正則匹配,如果有@符號,則判定為郵箱登入

if re.match(r'.*@.*', username):

user = models.user.objects.filter(email=username).first()

# 如果是11位數字且開頭為1,判定為手機登入

elif re.match(r'^1[0-9]$', username):

user = models.user.objects.filter(mobile=username).first()

# 兩個都不匹配的話,就判定為使用者名稱登入

else:

user = models.user.objects.filter(username=username).first()

# 如果使用者不存在,就是資訊有誤

if not user:

raise validationerror()

# 如果使用者存在,但是檢測密碼有問題,報錯密碼有誤

if not user.check_password(password):

raise validationerror()

return user

# views.py

from rest_framework.views import apiview

from . import models, serializers

from utils.response import apiresponse

class loginapiview(apiview):

authentication_classes =

permission_classes =

# 以post的方式接受前台傳送的資料

def post(self, request, *args, **kwargs):

# 將前台傳來的資料傳送到序列化物件中,完成校驗

serializer = serializers.loginserializer(data=request.data)

serializer.is_valid(raise_exception=true)

return apiresponse(msg='login success', data=)

drf元件之jwt認證

全稱 json web token 解釋 加密字串的原始資料是json,後台產生,通過web傳輸給前台儲存 格式 三段式 頭.載荷.簽名 頭和載荷用的是base64可逆加密,簽名用md5不可逆加密 內容 頭 基礎資訊,也可以為空 加密方式 公司資訊 專案組資訊 載荷 核心資訊 使用者資訊 過期時間 ...

常用的使用者認證方式 詳解JWT

和session的區別和優缺點 總結authentication 使用者認證,指的是驗證使用者的身份,例如你希望以小a的身份登入,那麼應用程式需要通過使用者名稱和密碼確認你真的是小a。由於http協議是無狀態的,每一次請求都無狀態。當乙個使用者通過使用者名稱和密碼登入了之後,他的下乙個請求不會攜帶任...

使用者認證 基於jwt和session的區別和優缺點

背景知識 authentication和authorization的區別 authentication 使用者認證,指的是驗證使用者的身份,例如你希望以小a的身份登入,那麼應用程式需要通過使用者名稱和密碼確認你真的是小a。由於http協議是無狀態的,每一次請求都無狀態。當乙個使用者通過使用者名稱和密...