首页 > 其他分享 >接口文档、jwt介绍和构成、jwt签发和认证、base64编码、drf-jwt编码、drf-jwt使用

接口文档、jwt介绍和构成、jwt签发和认证、base64编码、drf-jwt编码、drf-jwt使用

时间:2023-09-08 21:44:22浏览次数:39  
标签:编码 jwt self base64 queryset 接口 token drf

接口文档

作为后端,接口写好了,需要编写接口文档

作为前端,需要使用后端写的接口(移动端、web桌面端),可以照着接口文档写

接口文档的展现形式:

  1. word、md,写好传到公司的某个平台===》前端可以下载使用

  2. 自动生成接口文档===》后端通过配置===》把所写的接口都自动生成===》地址===》访问这个地址就能看到所有接口文档

  3. 公司内部搭建接口文档平台

    开源:Yapi===》搭建一个

    https://zhuanlan.zhihu.com/p/366025001  ===》搭建方式

  4. 使用第三方平台(花钱)===》showdoc

接口文档如何写?需要有那些东西?

  以用户注册接口为例:

    1. 接口描述

    2. 请求地址

    3. 请求方式

    4. 编码格式:json、urlencoded、form-data

    5. 请求参数:参数详解

      请求地址参数

      请求体参数

    6. 返回格式实例===》返回参数说明

    7. 备注(可有可无)===》错误码

自动生成接口文档

  coreapi、swagger:drf-yasg

coreapi自动生成

  第一步: pip install coreapi

  第二步:设置接口文档访问路径

from rest_framework.documentation import include_docs_urls
urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='站点页面标题'))
]

  第三步:在视图中,加注释

  第四步:配置文件配置

'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',

 jwt介绍和构成

做会话控制的发展历史

  https://www.cnblogs.com/liuqingzheng/p/8990027.html

jwt:Json Web Token:web方向的token认证方案

在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证(token串)。我们不再使用Session认证机制,转而使用 Json Web Token(本质就是token)认证机制

Json Web Token(JWT),JWT用在咱们前后端做登录认证的,如果登录了,就携带token过来,如果没登录,就不携带===》后端通过验证token的准确性,确定是谁访问我们

 JWT的构成:三部分

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

  头:header

    一般放公司信息,加密方式(没放秘钥)

  荷载:payload

    当前用户的信息:用户名,用户ID、token过期时间...

  签名:signature

    第一部分和第二部分通过加密得到的字符串

JWT签发与认证

以后使用jwt,最核心的就是写两个地方

  签发:(登录接口)

    登录接口,登录成功,签发token(三段式)

    header,用base64编码,暂放

      {"company": "公司信息",}

    payload,用base64编码,暂放

      {用户名,用户权限,过期时间}

    使用加密方式:md5,把 header 和 payload 都update进 md5 中===》生成签名===》base64编码

    三段拼起来===》用  .  分割

  认证(认证类)

    用户携带token过来,认证

    取出第一部分header

    取出第二部分 payload

    使用之前同样的加密算法(密码),得到新签名

    跟token的第三部分比较,如果一样,表示没有被篡改,顺利继续往下走,返回两个值

    如果被篡改了,抛异常

base64编码

作用,用途:

  1. token串使用base64编码

  2. 互联网中前后端数据交互,可以使用base64编码

  3. 图片二进制可以使用 base64 编码传递

import json
import base64
img='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'



# base64 的编码和解码(字符串)
###编码
d={'name':'lqz','age':19}
d_str=json.dumps(d)
res=base64.b64encode(d_str.encode('utf-8'))  # 字符串转bytes格式
print(res)  # eyJuYW1lIjogImxxeiIsICJhZ2UiOiAxOX0=
# base64编码字符串长度必须是4的倍数,如果不足,用= 补齐,= 一定不会超过3个
# 解码
res=base64.b64decode('eyJuYW1lIjogImxxeiIsICJhZ2UiOiAxOX0=')
print(res)



##把图片保存到本地
res=base64.b64decode(img)
with open('xx.png','wb') as f:
    f.write(res)

drf-jwt使用

django 中使用 jwt

可以自己写,也可以用第三方

  django-rest_framework-jwt  :版本有点老

  djangorestframework-simplejwt:新版本

下载:

pip install djangorestframework-jwt

django-rest_framework-jwt快速使用

# 签发:默认使用 auth 的 user 表签发==》登录接口--django帮我们写了
from rest_framework_jwt.views import obtain_jwt_token  # 这就是个登录接口,人家帮我们写好了
urlpatterns = [
    path('login/',obtain_jwt_token),
]

# 认证==》认证类
    # 视图类上,配置认证类和权限类
    authentication_classes = [JSONWebTokenAuthentication,]
    permission_classes = [IsAuthenticated]

定制签发返回格式

# 自定义认证返回结果

# 写个函数
def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'status': 100,
        'msg': '登录成功',
        'token': token,
        'username': user.username
    }

# 配置文件配置
JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.response.jwt_response_payload_handler',
}

源码分析

#为什么 路由这样配了,就会有个登录接口
     path('login/', obtain_jwt_token),
    
#obtain_jwt_token 本质是ObtainJSONWebToken.as_view()

# 本质是ObtainJSONWebToken
class ObtainJSONWebToken(JSONWebTokenAPIView):
    serializer_class = JSONWebTokenSerializer
    
# 向login发送post请求,ObtainJSONWebToken一定有个post方法

# 在父类中:JSONWebTokenAPIView  post
    -登录走的是JSONWebTokenAPIView的post,签发token 是在序列化类中
    -签发完token执行了,咱们写的jwt_response_payload_handler,所以才能定制返回格式

 

补充:

为什么在视图类中配置一个过滤类,就能走

filter_backends = [SearchFilter,MyFilter]
需要继承GenericAPIView;继承APIView的视图类,是不能这样配置的==》需要自己过滤
    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
还需要继承:ListModelMixin==》它的list方法中,在对所有数据做过滤:queryset = self.filter_queryset(self.get_queryset())

self.filter_queryset如何做的过滤呢?ListModelMixin类中没有这个方法,最终从GenericAPIView中找到了

    GenericAPIView的filter_queryset干了什么?
        def filter_queryset(self, queryset):
            # 过滤类
            for backend in list(self.filter_backends):  # filter_backends视图类中配置的过滤类,列表        # 过滤类加括号---》  过滤类的对象---》调用过滤类对象的filter_queryset
                queryset = backend().filter_queryset(self.request, queryset, self)
            return queryset
        
# 继承APIView---》写过滤---》可以复制GenericAPIView一些方法和属性,让我们少写代码

视图类中配置了分页类,为什么就有分页了

'''
pagination_class = CommonCursorPagination  # GenericAPIView类属性
pagination_class是GenericAPIView的类属性;继承APIView的视图类是不能这样配置的==》需要自己分页
还需要继承:ListModelMixin==》它的list方法中,在对所有数据做了分页
'''
def list(self, request, *args, **kwargs):
        # 做过滤
        queryset = self.filter_queryset(self.get_queryset())
        #### 分页开始
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        #### 分页结束### 
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
    
    -self.paginate_queryset(queryset)是  GenericAPIView  类的方法
    
    
    - GenericAPIView的   paginate_queryset
    def paginate_queryset(self, queryset):
        if self.paginator is None:
            return None # 不做分页了
        # 做分页
        return self.paginator.paginate_queryset(queryset, self.request, view=self)
    
    -self.paginator 方法包装成了属性,就是咱们分页类的对象  CommonCursorPagination()
    @property
    def paginator(self):
        self._paginator = self.pagination_class() # 咱们配置的分页类  CommonCursorPagination
        return self._paginator
    
    - 调用了 分页类对象的paginate_queryset---》完成真正的分页
        分页类对象.paginate_queryset(queryset, self.request, view=self)

为什么在配置文件中配置了自己写的全局异常处理函数,只要出了异常,它就会走?

之前是先执行了res = exception_handler(exc, context),现在要自己做,处理drf异常

-APIView执行流程---》dispatch的 
       try:
        except Exception as exc:
            response = self.handle_exception(exc) #看这里,exc是错误对象
            
    -执行:self.handle_exception(exc)---》self是视图类的对象
    -APIView的handle_exception(exc)
    -handle_exception源码
    
        def handle_exception(self, exc):
            exception_handler = self.get_exception_handler() # 猜 拿到的就是配置文件中配的那个函数
            response = exception_handler(exc, context) #执行这个函数,传了俩参数
            return response
        
     -self.get_exception_handler()是如何从配置文件中拿出来的
        -self.settings.EXCEPTION_HANDLER  # 先从项目配置文件中找:key为它的EXCEPTION_HANDLER,如果项目配置文件没有,拿drf内置的配置文件

如果你写了全局异常处理函数,配置好了,但是前端还没有返回固定格式,可能的原因是什么?
  -1 这个错误不是在三大认证和视图类的方法中产生的,之前产生的--》中间件,包装新的request
  -2 你写的common_exception执行出错了

 

标签:编码,jwt,self,base64,queryset,接口,token,drf
From: https://www.cnblogs.com/zfq132/p/17688600.html

相关文章

  • JWT
    1.介绍Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源......
  • jwt介绍和构成
    一、jwt介绍和构成1、jwt:JsonWebToken:web方向的token认证方案#做会话保持的发展历史 -https://www.cnblogs.com/liuqingzheng/p/8990027.html#jwt:JsonWebToken:web方向的token认证方案#在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证(token......
  • 接口文档,jwt介绍和构成,jwt签发与认证,base64编码,drf-jwt使用,django-rest-framewor
    1接口文档#作为后端,接口写好了#作为前端,需要使用我们写的接口(移动端,web,桌面端)#后端需要写接口文档#接口文档的展现形式: 1word,md,写好传到公司的某个平台---》前端可以下载2自动生成接口文档---》后端通过配置--》把所写的接口都自动生成---》地址--》访问......
  • drf-jwt使用
    一、jwt介绍和构成1.介绍jwt:JsonWebToken,Web方向的Token认证方案在用户注册或登录之后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证(token串)。我们不再使用session认证机制,而使用JsonWebToken(本质就是token)认证机制。JsonWebToken:JWT用在我们前后端......
  • 接口文档、jwt
    接口文档作为后端,接口写好了作为前端,需要使用我们写的接口(移动端、web、桌面端)后端需要写接口文档接口文档的展现形式:1、word,md,写好传到公司的某个平台,前端可以下载2、自动生成接口文档,后端通过配置,把所写的接口都自动生成,一个地址访问这个地址就能看到所有接口文档......
  • drf-day10
    接口文档解析图 接口文档展现形式作为后端,接口写好,还需要写接口文档作为前端,需要使用我们写的接口(移动端、web、桌面端)接口文档的展现形式:1.word、md,写好传到公司的某个平台,前端可以下载2.自动生成接口文档,后端通过配置,把所写的接口都自动生成一个地址,访问这个地址能看......
  • jwt和token的区别
    (目录)jwt和token的区别两者区别Token和JWT(JSONWebToken)是两种常见的身份验证机制,它们有以下区别:格式Token是一个字符串,通常包含了用户的身份信息和其他相关信息,例如用户ID、过期时间等。而JWT是一种特定的Token格式,它使用JSON对象来存储这些信息,并使用Base64编码进行传输......
  • drf—过滤、分页、异常
    session回顾写一个登录接口——保存用户登录状态签发阶段:做了三件事情:1、生成一个随机字符串2、django—session表中插入数据3、把随机字符串以cookie形式返回给前端(存在浏览器的cookie中)认证阶段:前端自动携带cookie到后端,sessionid:随机字符串session的流......
  • drf 分页类
    一、分页类型一1、写一个分页类,继承 PageNumberPaginationweb用这个多http://api.example.org/accounts/?page=4http://api.example.org/accounts/?page=4&page_size=100fromrest_framework.paginationimportPageNumberPagination,LimitOffsetPagination,CursorPagin......
  • 论文阅读_变分自编码器_VAE
    英文名称:Auto-EncodingVariationalBayes中文名称:自编码变分贝叶斯论文地址:http://arxiv.org/abs/1312.6114时间:2013作者:DiederikP.Kingma,阿姆斯特丹大学引用量:248401读后感VAE变分自编码(VariationalAutoencoder)是一种生成模型,它结合了自编码器和概率图模......