djangorestframework-jwt源码解析

  1. 获取token
    1. 安装djangorestframework-jwt包
    2. 导入from rest_framework_jwt.views import obtain_jwt_token
    3. 设置请求url

    1. 进入源码查看

同一文件中继承关系,并指定序列化器

    1. 首先查看继承的父类

父类继承APIView不难猜到为什么会有as_view()方法,但是需要注意的是这个类还有另一个方法POST

所以获取token一定是使用post进行请求的,此时这个post方法获取了serializer类。这就要提到上文说到的指定好的serializer类了,先看源码

这个序列化器类继承了serializer类,并且校验两个值,用户名,和密码。所以,在请求token这个路由时要携带用户名和密码。

    1. 继续观察post方法。方法当中调用了is_valid()进行校验,调用这个方法一定会去执行序列化器类的validate()方法,看看都干了什么

将用户名和密码放到一个字典里。然后调用django自带的验证方法authenticate()获取用户,如果有这个用户呢,就进行token加密。那我们来看看具体是怎么加密的,

先看payload部分,传入user用户

进去发现指向的是配置项里的东西,这个配置项在这

它好像是字典,对应的有个值,进去看看

就是它,参数就是接收一个user用户,看看代码具体干了什么

拿到id,username,还有过期时间,这个过期时间是可以配置的在settings.py里类似这样配置

继续看是怎么进行加密的,这个方法把payload反出去了,那我们还回去继续看那个调用处

拿到payload又进行了加工

重点说一下这个key,如果呢在settings里设置过JWT_PRIVATE_KEY私钥,那它就会用私钥配合加密,要是没有的话就会调用下面这个函数

这个函数也会判断你设置的是否有为每个用户设置一个密钥,要是没有就返回配置里的JWT_SECRET_KEY配合进行加密

这个眼熟么,对,它就是settings.py里生成的SECRET_KEY密钥,前提是,没有重新设置这个选项

所以在post方法里就能获取user和token了

怎么好像又进行加工了,再去看看

接收三个参数,只把token返回来了,所以以后要改写请求的返回值就只需要重写这个方法就可以了。

最后生成response对象进行返回

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值