jwt認證生成后的token如何傳回后端並解析的詳解


jwt認證生成后的token后端解析

一.首先前端發送token

token所在的位置headers

{'authorization':token的值',Content-Type':application/json}

在ajax寫

//只展示headers部分代碼
headers:{"authorization":this.$cookies.get("token")}
//token值一般是放在cookies里面
//ajax提交默認就是json格式所有不需要聲明js格式

二.后端接受並解析token

1.首先先定義個認證類

from rest_framework.exceptions import AuthenticationFailed
import jwt
from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication
from rest_framework_jwt.authentication import jwt_decode_handler
from rest_framework_jwt.authentication import get_authorization_header
class JWTAuthentication(BaseJSONWebTokenAuthentication):
    # 自定義認證類,重寫authenticate方法
    def authenticate(self, request):
        # 認證通過,返回user,auth
        # 認證失敗,返回None
        # auth = request.META.get('HTTP_AUTHORIZATION')  # 前台用auth攜帶token
        # 通過前台傳過來的請求頭中獲取auth
        auth = get_authorization_header(request)
        if not auth:
            raise AuthenticationFailed('Authorization 字段是必須的')
        try:
            payload = jwt_decode_handler(auth)

        # 出現jwt解析異常,直接拋出異常,代表非法用戶,也可以返回None,作為游客處理
        except jwt.ExpiredSignature:
            raise AuthenticationFailed('token已過期')
        except:
            raise AuthenticationFailed('token非法')

        user = self.authenticate_credentials(payload)
        return (user, auth)

關於其中的幾個方法

  • auth = request.META.get('HTTP_AUTHORIZATION') 獲取token的字符串格式
  • auth = get_authorization_header(reuqest對象) 獲取token的二進制格式
  • jwt_decode_handler(token的二進制格式)
    • 如果token沒有過期:返回用戶信息
    • 如果token過期:拋異常,過期的異常是jwt.ExpiredSignature
  • authenticate_credentials(jwt_decode_handler解析后信息)返回user對象

2.局部調用用戶認證類

#評率認證類寫法
from rest_framework.throttling import SimpleRateThrottle

class SMSRateThrottle(SimpleRateThrottle):
    scope = 'sms'    #這個是為了全局設置給予的一個變量名稱
    
    # 只對提交手機號的get方法進行限制
    def get_cache_key(self, request, view):
        mobile = request.query_params.get('mobile')
        # 沒有手機號,就不做頻率限制
        if not mobile:
            return None
        # 返回可以根據手機號動態變化,且不易重復的字符串,作為操作緩存的key
        return 'throttle_%(scope)s_%(ident)s' % {'scope': self.scope, 'ident': mobile}
class Test(APIView):
    authentication_classes = [我們自定義用戶認證的類] #如[JWTAuthentication]
    #來判斷登入賬號的信息算游客還是正常用戶
    
   	permission_classes =[IsAuthenticated] 
    #給與權限
    #AllowAny:允許所有
    #IsAuthenticated:只允許登入用戶
    #IsAuthenticatedOrReadOnly:游客只讀,登錄用戶無限制
    #IsAdminUser:是否是后台用戶
    
    DEFAULT_THROTTLE_RATES = [頻率認證類]#如[SMSRateThrottle]
    #局部評率認證
    
    
    
    #滿足以上給予的權限才可以進行下面的操作

3.全局調用用戶認證類

setting.py中

#drf配置
"""
AllowAny:允許所有用戶
IsAuthenticated:只允許登錄用戶
IsAuthenticatedOrReadOnly:游客只讀,登錄用戶無限制
IsAdminUser:是否是后台用戶
"""
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # django默認session校驗:校驗規則 游客 及 登錄用戶
        # 'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework.authentication.BasicAuthentication',
        # 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'api.authentications.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.AllowAny',
        # 全局配置:一站式網站(所有操作都需要登錄后才能訪問)
        # 'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'user': '5/min',  # 登錄的用戶一分鍾可以訪問5次
        'anon': '3/min',   # 游客一分鍾可以訪問3次
        'sms': '1/min'     #同一個手機1分鍾一次
    }
}

jwt配置
import datetime
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=1000), #生成token有效期
    'JWT_AUTH_HEADER_PREFIX': 'TOKEN',
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM