jwt认证

jwt认证

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

cookie,session,token介绍

Cookie,Session,Token发展史

详情请点击https://www.cnblogs.com/liuqingzheng/p/8990027.html

Cookie,Session,Token的含义

  • cookie是:存在客户端浏览器的键值对
  • session是:存在于服务端的键值对
  • token是:三段式,服务端生成的,存放在客户端(浏览器就放在cookie中,移动端:存在移动端中)

Cookie和Session详情

详情请点击https://www.cnblogs.com/nirvana001/p/16690657.html

Token

  • token的三段式

    第一段:头:公司信息,加密方式。。。 {}

    第二段:荷载:真正的数据 {name:jcs,id:1}

    第三段:签名,通过第一段和第二段,通过某种加密方式加密得到的 aafasdfas

  • token的使用

    token的使用分两个阶段:

    1.登录成功后的【签发token阶段】---》生成三段

    img

    2.登录成功访问某个接口的 【验证阶段】---》验证token是否合法

    img

  • 使用token的认证机制,服务端还要存数据吗?

    ​ token是服务的生成,客户端保存,服务的不存储token

jwt的原理介绍

jwt(Json web token) 是 token 的应用于web方向的称之为jwt

JWT的构成

JWT由 header、 payload 、 signature 三部分构成

  • 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

JWT的原理

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

如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意事项

secret是保存在服务器端的(加密方式+盐),jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

  • jwt使用流程最核心的是

    签发:登录接口签发

    认证:认证类认证

session认证机制和jwt认证机制的差别

  • session认证机制

    image
    )

  • jwt认证机制

    image

base64编码和解码

  • base64编码和解码的场景

    ​ base64多用于 jwt认证

    ​ 网络中传输字符串就可以使用base64编码

    ​ 网络中传输图片,也可能使用base64的编码

  • 如何使用base64进行编码解码

    • 字符串格式

      import json
      import base64
      d = {'name': 'lqz', 'userid': 6, 'age': 19}
      info = json.dumps(d)
      print(info)
      # 把字符串使用base64编码
      res=base64.b64encode(info.encode('utf-8'))
      print(res)  # eyJuYW1lIjogImxxeiIsICJ1c2VyaWQiOiA2LCAiYWdlIjogMTl9
      

      ​ 将字典转成json字符串的形式

    • 图片格式

      import base64
      #图片地址
      img_path = 'D:xxx/file/img/juwan.jpg'
      # 编码
      with open(img_path, 'rb') as f:
          image_data = f.read()
          base64_data = base64.b64encode(image_data)  # base64编码
          print(base64_data)
          print(type(base64_data))
      """
      将编码后的数据转换为字符串,直接str(base64_data),字符串前还是会有 b ’ ’
      可以str(base64_data, ‘utf-8’) 去掉字符串前面的 b ’ ’
      
      """
       
      # 解码
      with open('1.jpg', 'wb') as file:
          jiema = base64.b64decode(base64_data)  # 解码
          file.write(jiema)  # 将解码得到的数据写入到图片中
      
      
      

drf-jwt快速使用

  • django中使用jwt

    https://github.com/jpadilla/django-rest-framework-jwt (比较老)

    https://github.com/jazzband/djangorestframework-simplejwt (比较新)

  • 安装drf-jwt第三方插件

    pip install djangorestframework-jwt
    
  • 快速使用的步骤

    1.迁移表,因为它默认使用auth的user表签发token

    2.创建超级用户(auth的user表中要有记录)

    3.不需要写登录接口,如果是使用auth的user表作为用户表,它可以快速签发

    4.签发(登录):只需要在路由中配置(因为它帮咱们写好登录接口了)

    • 创建超级用户

      python3 manage.py createsuperuser
      
    • 配置路由urls.py

      from django.urls import path
      from rest_framework_jwt.views import obtain_jwt_token
      urlpatterns = [
          path('login/', obtain_jwt_token),
      ]
      
    • 接口(postman)测试

      ​ 向后端接口发送post请求,携带用户名密码,即可看到生成的token

    • settings配置

      import datetime
      JWT_AUTH = {
          # 过期时间1天
          'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
          # 自定义认证结果:见下方序列化user和自定义response
        	# 如果不自定义,返回的格式是固定的,只有token字段
          'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',  
      }
      
    • 认证(认证类):导入,配置在视图类上

      class TestView(APIView):
          authentication_classes = [JSONWebTokenAuthentication,]
          permission_classes = [IsAuthenticated,]
      
    • 前端访问时,token需要放在请求头中

      Authorization:jwt token串
      

drf-jwt修改返回格式

  • 如何修改drf-jwt的返回格式

    写一个函数,函数返回什么,前端就看到什么,配置在配置文件中

  • 具体步骤

    1.写函数

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

    2.把函数配置在配置文件中

    JWT_AUTH={
            'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.response.jwt_response_payload_handler',
        	}
    

    以后登录接口返回的格式就是咱们写的函数的返回值

自定义user表,签发token

models.py 中定义UserInfo表

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

写一个登录接口

from rest_framework.exceptions import APIException

from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

from .models import UserInfo
class UserView(APIView):
    def post(self, request):
        try:
            username = request.data.get('username')
            password = request.data.get('password')
            user=UserInfo.objects.get(username=username,password=password)
            # 根据user,签发token---》三部分:头,荷载,签名
            # 使用djagnorestframework-jwt模块提供的签发token的函数,生成token
            payload = jwt_payload_handler(user) # 通过user对象---》{username:lqz,id:1,过期时间}
            token=jwt_encode_handler(payload) # 根据payload---》得到token:头.荷载.签名
            print(payload)
            print(token)

            return Response({'code':100,'msg':'登录成功','token':token})
        except Exception as e:
            raise APIException('用户名或密码错误')

posted @   Nirvana*  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示