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',
}