首页 > 编程语言 >jwt原理,jwt开发流程,drf-jwt快速使用,drf-jwt定制返回格式,drf-jwt自定义用户表签发,drf-jwt自定义认证类,drf-jwt的签发源码分析,z

jwt原理,jwt开发流程,drf-jwt快速使用,drf-jwt定制返回格式,drf-jwt自定义用户表签发,drf-jwt自定义认证类,drf-jwt的签发源码分析,z

时间:2023-05-29 22:11:32浏览次数:55  
标签:自定义 jwt 认证 token user payload drf

jwt原理:

  

 

   JWT就是一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串

    

    1 header jwt的头部承载两部分信息:
      声明类型,这里是jwt
      声明加密的算法 通常直接使用 HMAC SHA256
      公司信息
        {
        'typ': 'JWT',
        'alg': 'HS256'
        }
      然后将头部进行base64编码,构成了第一部分.
        eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

    2 payload 载荷就是存放有效信息的地方。
      当前用户信息,用户名,用户id
      exp: jwt的过期时间,这个过期时间必须要大于签发时间

      定义一个payload:
      {
      "exp": "1234567890",
      "name": "John Doe",
      "user_id":99
      }
      然后将其进行base64编码,得到JWT的第二部分。
      eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9


    3. signature JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

      header (base64后的)
      payload (base64后的)
      secret
      这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

  将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

jwt开发流程:

  使用jwt认证的开发流程,就是两部分
    -第一部分:签发token的过程,登录做的
      -用户携带用户名和密码,访问我,我们校验通过,生成token串,返回给前端
    -第二部分:token认证过程,登录认证时使用,其实就是咱们之前讲的认证类,在认证类中完成对token的认证操作
      -用户访问我们需要登陆后才能访问的接口,必须携带我们签发的token串(请求头)
      -我们取出token,验证该token是否过期,是否被篡改,是否是伪造的
      -如果正常,说明荷载中的数据,就是安全的,可以根据荷载中的用户id,查询出当前登录用户,放到request中即可

drf-jwt快速使用:

  安装:pip3 install djangorestframework-jwt

  快速使用:

    -签发过程(快速签发),必须是auth的user表(人家帮你写好了)
      -登录接口--》基于auth的user表签发的
    -认证过程
      -登录认证,认证类(写好了)

      url内:

       view内:

       前端:

 

   总结:
    -签发:只需要在路由中配置
      from rest_framework_jwt.views import obtain_jwt_token
      urlpatterns = [
      path('login/', obtain_jwt_token),
      ]
    -认证:视图类上加
      class BookView(APIView):
        authentication_classes = [JSONWebTokenAuthentication] # 认证类,drf-jwt提供的
        permission_classes = [IsAuthenticated] # 权限类,drf提供的
    -访问的时候,要在请求头中携带,必须叫
       Authorization:

       jwt token串

drf-jwt定制返回格式:

   登录签发token的接口,要返回code,msg,username,token等信息

    写一个py文件:

def common_sponse(token,user=None,request=None):
    return {
        'code':100,
        'msg':'登陆成功',
        'username':user.username,
        'token':token,
    }

    setting中配置:

JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.s.common_sponse',  #app01.s.common_sponse为写的py文件路径
}

drf-jwt自定义用户表签发:

    view中:

from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
class UserView(ViewSet):
    def login(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()
        print(user)
        if user:
            # 登录成功,签发token
            # 通过user获取payload
            payload = jwt_payload_handler(user)
            print(payload)
            # 通过payload获取token
            token = jwt_encode_handler(payload)
            return Response({'code': 100, 'msg': '登陆成功', 'username': user.username, 'token': token})
        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})

    url内:

urlpatterns = [

    path('login/', UserView.as_view({'post': 'login'}))
]

 

drf-jwt自定义认证类:

   序列化类中:

import jwt
from rest_framework.authentication import BaseAuthentication

from rest_framework_jwt.settings import api_settings

jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
from app01.models import User
from rest_framework.exceptions import AuthenticationFailed


class JWTAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.META.get('HTTP_TOKEN')
        try:
            payload = jwt_decode_handler(token)
            user_id = payload.get('user_id')
            user = User.objects.get(pk=user_id)
        except  jwt.ExpiredSignature:
            raise AuthenticationFailed('token过期')
        except  jwt.DecodeError:
            raise AuthenticationFailed('解码失败')
        except  jwt.InvalidTokenError:
            raise AuthenticationFailed('token认证异常')
        except  Exception:
            raise AuthenticationFailed('token认证异常')
        return user, token

   view中:

from app01.auth import JWTAuthentication
class BookView(APIView):
    authentication_classes = [JWTAuthentication]

    def get(self, request):
        return Response('看见人了')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


   

标签:自定义,jwt,认证,token,user,payload,drf
From: https://www.cnblogs.com/Hao12345/p/17441817.html

相关文章

  • jwt原理开发,drf-jwt快速使用和自定义使用,jwt签发认证源码分析
    一眼弄懂cookieSeesiontoken区别彻底弄懂cookie,session和token区别1jwt原理1.1使用jwt认证和使用session认证的区别1.2三段式eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEf......
  • 自定义注解时常用注解
    @Target@Target:注解的作用目标@Target(ElementType.TYPE)——接口、类、枚举、注解@Target(ElementType.FIELD)——字段、枚举的常量@Target(ElementType.METHOD)——方法@Target(ElementType.PARAMETER)——方法参数@Target(ElementType.CONSTRUCTOR)——构造函数@Target(Eleme......
  • Hive的用户自定义函数实现步骤与流程
    参考答案:1、如何构建UDF?用户创建的UDF使用过程如下:第一步:继承UDF或者UDAF或者UDTF,实现特定的方法;第二步:将写好的类打包为jar,如hivefirst.jar;第三步:进入到Hive外壳环境中,利用addjar/home/hadoop/hivefirst.jar注册该jar文件;第四步:为该类起一个别名,createtemporaryfunctionmylen......
  • Flask010_自定义过滤器
    在模板中,通过过滤器实现对变量的处理。过滤器本质上是Python的函数,它会把被过滤器的值当作第1个参数传送给函数。自定义过滤器定义1defdatetime_format(value,format="%Y-%m-%d%H:%M"):2returnvalue.strftime(format)345app.add_template_filter(date......
  • DRF之通过GenericAPIView的视图子类实现数据的增删改查接口
    1、安装DRFpipinstalldjangorestframework2、将DRF注册到APP中INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','djan......
  • Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联
     Vo:/***用来返回给前端展示列表的数据实体*/@DatapublicclassCourseVoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringid;privateStringtitle;privateStringsubjectParentTitle;private......
  • Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询
     一、引言MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么今天说说MP怎么自定义sql语句吧。 二、具体实现使用注解实现:在我们Mapper接口中定义自定义方法即可。/***@Date:2019/6/1014:40*@Description</span>:User对象持久层*/p......
  • DRF学习第4课
    1,认证和权限的使用在settings.py配置,可全局,也可以单独针对某个类#AllowAny允许所有用户#IsAuthenticated仅通过认证的用户#IsAdminUser仅管理员用户#IsAuthenticatedOrReadOnly认证的用户可以完全操作,否则只能get读取2,限流1,用户限流2,视图限流3,过滤Filteringpipi......
  • 普加项目管理中间件示例之三:自定义单元格样式,行样式,以及单元格内容
    通过监听处理"drawcell"事件,可以根据任务信息,设置行、单元格样式,以及自定义单元格Html内容。参考示例demo/DiyDisplay.html。代码如下:project.on("drawcell",function(e){vartask=e.record,column=e.column,field=e.field;//单元格样式if(column.name......
  • 普加项目管理中间件示例之四:自定义单元格可编辑
    通过监听处理"cellbeginedit"事件,可以控制每个行、每个单元格是否可编辑。参考示例:demo/DiyEditable.html代码如下://控制单元格是否可编辑project.on("cellbeginedit",function(e){vartask=e.record,column=e.column,field=e.field;//控制行,摘要任务不可编辑if......