raynduan

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

分类:

技术点:

相关文章: