接口文档、jwt

发布时间 2023-09-08 17:30:19作者: 别管鱼油我了

接口文档

作为后端,接口写好了

作为前端,需要使用我们写的接口(移动端、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自动生成:

  1、pip install coreapi

  2、设置接口文档访问路径

      from rest_framework.documentation import include_docs_urls 

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

  3、在视图中,加注释

  4、配置文件配置

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

  

 

jwt介绍和构成

做会话保持的发展历史

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

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

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

JWT的构成:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

头:header (一般放公司信息,加密方式(这里没有放密钥))

荷载:payload

  当前用户信息:用户名,用户id,token过期时间

签名:signature

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

 

 

jwt签发与认证

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

  1、签发:(登录接口)

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

    header,用base64编码,暂放

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

    payload,用base64编码,暂放

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

    使用加密方式:md5,把header和payload都update进md5中,生成前面,base64编码

    三段拼接起来,用 . 分割

  2、认证(认证类)

      用户携带token过来,认证

      取出第一部分header

      取出第二部分payload

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

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

      如果被篡改了,就抛异常

 

base64编码

base64编码

作用,用途

1、token串使用base64编码

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

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

 

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)

def-jwt使用

django中使用jwt

可以自己写,使用第三方 

    -django-rest-framework-jwt:有点老
    -djangorestframework-simplejwt:新的
-自己写:

    https://gitee.com/liuqingzheng/rbac_manager/blob/master/libs/lqz_jwt/token.py

 

下载:

  pip install djangorestframework-jwt

 

django-rest-framework-jwt快速使用

签发:

  默认使用auth的user表签发,登录接口,人家帮咱们写了

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,所以才能定制返回格式