drf 集成监控大屏 restframework-jwt 等登录接口 源码分析

drf 集成监控大屏 restframework-jwt 等登录接口 源码分析

1、simpleui 集成监控大屏

从gitee上找到开源的前端页面—》集成到项目中即可
https://gite.com/lvyeyou/DaShuJuZhiDaPingZhanShi?_from=gitee_search

本质就是前后端混合项目

2、restframework-jwt执行流程分析

签发的token,有过期时间,过期时间是?配置一般为7天

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

双token认证
用户正在app或者应用中操作 token突然过期,此时用户不得不返回登录界面,重新进行了一次登录,这种体验性不好,于是引入双token检验机制

实现原理:
首次登录时服务端返回两个tokenaccessTokenrefreshToken,accessToken过期时间比较短,refreshToken 时间比较长,且每次使用会刷新,每次刷新后的refreshToken都是不同

refreshToken假设7天,accessToken过期时间5分钟
正常使用accessToken即可,如果accessToken过期了,重新发请求,携带refreshToken过来,能正常返回,并且这次响应中又带了acessToken

django中顶格写的代码,都会执行

签发流程>>> 本质就是登录接口>>> 校验用户是否正确,如果正确签发token写到了序列化类中,如果不正确,返回错误

obtain_jwt_token:核心代码--ObtainJSONWebToken.as_view()
ObtainJSONWebTokenToken 视图类实现登录功能
class ObtainJSONWebToken(JSONWebTokenAPIView):
    	serializer_class = JSONWebTokenSerializer

父类ObtainJSONWebToken

class JSONWebTokenAPIView(APIView):
        # 局部禁用掉权限和认证
        permission_classes = () 
        authentication_classes = ()

        def get_serializer_context(self):
            return {
                'request': self.request,
                'view': self,
            }

        def get_serializer_class(self):
            return self.serializer_class

        def get_serializer(self, *args, **kwargs):
            serializer_class = self.get_serializer_class()
            kwargs['context'] = self.get_serializer_context()
            return serializer_class(*args, **kwargs)

        def post(self, request, *args, **kwargs):
            # JSONWebTokenSerializer实例化得到一个序列号类的对象,传入前端传的只
            serializer = self.get_serializer(data=request.data)

            if serializer.is_valid(): # 校验前端传入的数据是否合法:
                #1 字段自己的规则 2 局部钩子 3 全局钩子(序列化类的validate方法)
                # 获取当前登录用户和签发token是在序列化类中完成的  # obj 为serializer父类的 方法
                # 从序列化类对象中取出了当前登录用户     or 这里 表示 前者 未取到 则执行后者
                user = serializer.object.get('user') or request.user
                # # 从序列化类对象中取出了token
                token = serializer.object.get('token')
                # 自定义过
                response_data = jwt_response_payload_handler(token, user, request)
                response = Response(response_data)
                return response

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

jwt 认证 源码分析

# 认证
	-认证类;JSONWebTokenAuthentication
    class JSONWebTokenAuthentication(BaseJSONWebTokenAuthentication):
        def get_jwt_value(self, request):
            # get_authorization_header(request)根据请求头中HTTP_AUTHORIZATION,取出token
            # jwt adsfasdfasdfad
            # auth=['jwt','真正的token']
            auth = get_authorization_header(request).split()
            auth_header_prefix = api_settings.JWT_AUTH_HEADER_PREFIX.lower()
            if not auth:
                if api_settings.JWT_AUTH_COOKIE:
                    return request.COOKIES.get(api_settings.JWT_AUTH_COOKIE)
                return None
            if smart_text(auth[0].lower()) != auth_header_prefix:
                return None
            if len(auth) == 1:
                msg = _('Invalid Authorization header. No credentials provided.')
                raise exceptions.AuthenticationFailed(msg)
            elif len(auth) > 2:
                msg = _('Invalid Authorization header. Credentials string '
                        'should not contain spaces.')
                raise exceptions.AuthenticationFailed(msg)
            return auth[1]
        
   -父类中:BaseJSONWebTokenAuthentication---》authenticate
class BaseJSONWebTokenAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # jwt_value前端传入的token
        jwt_value = self.get_jwt_value(request)
        # 前端没有传入token,return None,没有带token,认证类也能过,所有咱们才加权限类
        if jwt_value is None:
            return None
        try:
            payload = jwt_decode_handler(jwt_value) # 验证token,token合法,返回payload
        except jwt.ExpiredSignature:
            msg = _('Signature has expired.')
            raise exceptions.AuthenticationFailed(msg)
        except jwt.DecodeError:
            msg = _('Error decoding signature.')
            raise exceptions.AuthenticationFailed(msg)
        except jwt.InvalidTokenError:
            raise exceptions.AuthenticationFailed()

        user = self.authenticate_credentials(payload) # 通过payload得到当前登录用户

        return (user, jwt_value) # 后期的request.user就是当前登录用户
    
    
 # 它这个认证类:只要带了token,request.user就有只,如果没带token,不管了,继续往后走
大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码大数据可视化大屏前端源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值