DRF之JWT簡介

一:認證規則圖

(1)Django先後端不分離

 (2)DRF分離

 二:認證規則演變圖

(1)數據庫session認證

 PS:git

  (1)驗證低效率 es6

  (2)當有大量的用戶存儲在數據庫中 查表會很慢github

(2)緩存認證

 PS:在緩存中有I/O操做算法

(3)JWT認證

 (4)緩存認證 不易併發

 (5)緩存認證 易併發

 三:JWT簡介

(1)做用

  (1)服務端產生token 傳輸給客戶端 服務端不須要保存token減少服務端壓力數據庫

  (2)服務端存儲的是簽發和認證的兩端算法 django

  (3)算法完成各集羣服務器同步成本低,路由項目完成集羣部署(適應高併發)json

(2)格式

(1)採用三段式格式 頭部 + 載荷 + 簽名後端

(2)每一部分都是一個json字典加密以後造成的字符串緩存

(3)頭部 + 載荷 實驗bases64位加密算法 該算法可逆服務器

(4)簽名採用hash256 不可逆

(5)格式內容

  (1)頭部:基礎信息 ---> 公司名稱 項目組信息等等

  (2)載荷:有用可是非隱私信息 --- > 用戶公開信息 過時時間等

  (3)簽名:頭部 + 載荷 + 祕鑰 不可逆算法

(6)簽發token:

  (1)頭部可逆算法加密  ---> 固定頭部信息加密

  (2)載荷可逆算法加密 ---> 當前用戶 過時時間加密

  (3)簽名不可逆算法  ---> 頭部 + 載荷 + 祕鑰生成不可逆加密

(7)校驗token:

  (1)頭部校驗可選

  (2)載荷校驗用戶與過時時間

  (3)簽名檢驗 頭部 + 載荷 + 祕鑰檢驗token是否被篡改

(3)使用安裝

(1)官網

https://github.com/jpadilla/django-rest-framework-jwt

(2)安裝

pip3 install djangorestframework-jwt

(3)簽發token

# 二者簽發token方式是相同的
from rest_framework_jwt.views import ObtainJSONWebToken,obtain_jwt_token
urlpatterns = [
  
    url(r'^login/$', ObtainJSONWebToken.as_view()),
    url(r'^login/$', obtain_jwt_token)

]

PS:

  (1)此時get方法不被容許

  (2)只有post會被容許

(4)驗證信息輸入與結果

{
    "username":"admin",
    "password":"admin123"
}
PS:
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTcxNzUzODY5LCJlbWFpbCI6IiJ9.rkI5BYdq9HFmIIW0Z8H7zb1g-XA4SYSy_RY5DKbuupM"

PS:

  (1)數據錯誤不會反會信息

  (2)每次發送token都會改變

(5)認證校驗token

# 路由層
   url(r'^test_token/$', views.Login.as_view()),
# 視圖層
# 只有登陸且經過認證的用戶才能夠訪問

from rest_framework_jwt.authentication import JSONWebTokenAuthentication   # 查看是否經過認證
from rest_framework.permissions import IsAuthenticated # 用戶必須登陸
class Login(APIView):

    permission_classes = [IsAuthenticated]   # 局部驗證用戶必須登陸

    authentication_classes = [JSONWebTokenAuthentication]   # 局部檢驗token
    def get(self,request,*args,**kwargs):

       return Response({
           'status':0,
           'msg':'測試成功',
           'results':request.user.username
       })
相關文章
相關標籤/搜索