cookie,session,token介绍,jwt原理介绍,base64编码和解码,drf-jwt快速使用,drf-jwt修改返回格式,自定义user表,签发token

1.cookie,session,token介绍

这三者之间是有联系的,在互联网发展初期先有了cookie,在发展的过程中,因为出现了登录,还有购物车等功能,这是http的请求是无状态的,这是要解决这个问题,于是session就出来了,每次发送http请求的时候,都会带过来session,session说白了就是一段字符串,如果用了两个机器作为一个集群,此时在a机器申请的b机器不知道,要是a机器坏了就没办法保存,这是就把两个机器每隔一段时间复制一次,后来有个人提出来既然都要复制,那我们为什么不把session做一个新的,当有请求的时候让这两台机器去调用session就好了,这样做有个弊端,那就是如果session坏了,那不是所有人都要重新登录一遍,于是token就出来了,token就相当于一个令牌,只要调用这个令牌就是你在访问,就不用掉session,但是这样,如果别人可以伪造个token的话,那不是所有人都能用你这个token去发请求,于是自己加个一个令牌,然后用加密给所有token给加密了,这是只有我才知道这么秘钥,每当别人发请求的时候只有我才有这个秘钥,此时在进行解码,如果这个秘钥能解,那么我就知道登录了,这时可以直接取到他的id就能知道是这个人在操作了

2.jwt原理介绍

其实说白了jwt就是一串字符串,由三段构成,分别是头,载荷,令牌,最终显示的是这样的:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

复制代码
    # header:头
        -声明类型,这里是jwt
        -声明加密的算法 通常直接使用 HMAC SHA256
        -公司信息
        由
        {
          'typ': 'JWT',
          'alg': 'HS256'
        }
        变成了(base64的编码)
        eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    # payload:荷载
        exp: jwt的过期时间,这个过期时间必须要大于签发时间
        iat: jwt的签发时间
        用户信息: 用户信息
        由
        {
          "exp": "1234567890",
          "name": "John Doe",
          "userid": 3
        }
       变成了(base64的编码)
       eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
        
    # signature:签名
        把头和荷载加密后得到的:TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
复制代码

3.base64编码和解码

复制代码
import base64
import json
w='123'
w1 = json.dumps(w) #转换成json格式
s = base64.b64encode(w1.encode('utf-8'))   #加密
print(s)

s1 = base64.b64decode(s)   #解密
print(s1)
复制代码

4.drf-jwt快速使用

drf-jwt只能使用auth的user表来签发token,要是不用auth中的user来签发token则需要我们自己写个逻辑

同时用drf-jwt就不用我们写登录接口,因为他已经配置好登录接口了

在路由中写

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('login/', obtain_jwt_token),
]

当前端访问时,我们需要写个视图类,然后在需要加个身份类验证,在加个是否登录的认证就行。

复制代码
from rest_framework.views import APIView
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

class TestView(APIView):
    authentication_classes = [JSONWebTokenAuthentication, ]
    permission_classes = [IsAuthenticated, ]

    def get(self,request ):
        return Response('OK')
复制代码

5.drf-jwt修改返回格式

需要从drf-jwt配制文件中找他原来的返回格式在'JWT_RESPONSE_PAYLOAD_HANDLER'这个后面,然后把他写的cv下来,return是自己加几个值就行,同时需要修改配制文件中的DATABASES,把这个字典name的value加个str,或者os.path.join就好

复制代码
def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'code' : 101,
        'user' : user.username,
        'msg'  :'登录成功',
        'token': token
    }


JWT_AUTH = {'JWT_RESPONSE_PAYLOAD_HANDLER' :'app01.request.jwt_response_payload_handler'}
复制代码

 6.自定义user表,签发token

复制代码
class NextView(APIView):
    authentication_classes = [JSONWebTokenAuthentication, ]
    permission_classes = [IsAuthenticated, ]
    # def get(self,request):
    #     return Response({'username':request.user.username,
    #                      # 'token':request.data.get('')
    #                      })

    def post(self, request):
        try:
            username = request.data.get('username')
            password = request.data.get('password')
            res = User.objects.get(username=username, password=password)
            payload = jwt_payload_handler(res)
            token = jwt_encode_handler(payload)
            return Response({
                'code': 100,
                'user': username,
                'msg': '登录成功',
                'token': token
            })
        except Exception:
            raise APIException('用户名或密码错误')
复制代码

 

posted @   shangxin_bai  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示