接口文档、jwt介绍和原理、drf-jwt快速使用、定制返回格式、jwt的认证类

drf-接口文档

我们接口编写好了之后,就需要编写接口文档,给前端的人使用
前端开发人员根据后端人员写的接口写app,pc,小程序
对于后端人员来讲,我们清楚请求地址,请求方式,支持的编码方式,请求参数(get,post参数),返回格式实例
# 为了前后端更好的配合工作,后端写完接口后,一定要写接口文档!!!

接口文档的写法

1.直接使用word或者md写(很多公司现在还在用这种方法)
2.使用接口文档平台,直接在接口文档平台录入
	eg:
     	https://www.showdoc.com.cn/(收费)
        https://hellosean1025.github.io/yapi/(百度开源的自己搭建的)
3.没有钱,不想花钱,也没有能力自己开发的话,那就使用开源的YAPI
	教程地址:
    	 https://zhuanlan.zhihu.com/p/366025001
4.使用drf编写的接口,开源自动生成接口文档
	swagger---》drf-yasg---》官方推荐使用
    网址:
    	https://www.django-rest-framework.org/topics/documenting-your-api/
5.使用coreapi自动生成接口文档

image

# 使用coreapi自动生成接口文档步骤
1.安装
	pip3.8 install coreapi -i https://mirrors.aliyun.com/py
pi/simple/ spyder
2.配置路由
from rest_framework.documentation import include_docs_urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include(router.urls)),
    path('docs/', include_docs_urls(router.urls)),
]
3.在视图类,方法上加注释就好了
4.配置文件配置
	REST_FRAMEWORK = {
    	'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
	}

# 接口文档,需要有的东西
	-描述
    -地址
    -请求方式
    -请求编码格式
    -请求数据详解(必填,类型)
    -返回格式案例
    -返回数据字段解释
    -错误码

image

jwt介绍和原理

Json web token(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(sso)场景,JWT的声明一般被用来在身份提供者和服务者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密

image

img

image

 Cookie:是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
 Cookie由服务器生成,发给浏览器后,浏览器会把Cookie以kv形式保存到某个目录下的文本文件内,等下次请求时会把该Cookie发给服务器
Session:session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。
session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。
Token:在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。
特点:无状态,可扩展,支持移动设备,跨程序调用,安全
cookie和session的区别:
 1.session是存储服务器端,cookie是存储在客户端,所以session的安全性比cookie高
 2.session的信息是通过sessionid获取的,而sessionid是存放在会话cookie中

jwt的构成

 jwt就是一段字符串,有三段信息构成,将着三段信息用.连接到一起就构成了 jwt字符串,
eg:
  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
第一部分称为头部,第二部分称为荷载,第三部分称为签证
1. jwt的头部(header)承载两部分信息:
    声明类型:这里是jwt
    声明加密的算法 通常直接使用 HMAC SHA256
    公司信息等
2. 荷载(payload)
	荷载就是放有效信息的地方,有效信息包含:
    	标准中注册的声明
        公共的声明
        私有的声明 
3.签名(signature)
		第一部分和第二部分通过秘钥+加密方式得到的
    		header
        	payload
            secret
#  base64编码和解码
编码:
import base64
import json
dic = {'user_id':1,'username':'jia'}
dic_str = json.dumps(dic)
# 把这个字符串使用base64编码
res = base64.b16encode(dic_str.encode('utf-8'))
print(res)
解码:
res = base64.b64decode('7B22757365725F6964223A20312C2022757365726E616D65223A20226A6961227D')
print(res)

drf-jwt快速使用

image

jwt:签发(登录接口) 认证(认证类)
#django+drf 平台开发jwt这套,有两个模块
	-djangorestframework-jwt  ---》一直可以用
    -djangorestframework-simplejwt---》公司用的多---》希望你们试一下
    -自己封装jwt签发和认证
下载:
	pip3.8 install djangorestframework-jwt -i https://mirro
rs.aliyun.com/pypi/simple/ spyder

下载rest_framework_jwt:
pip3.8 install djangorestframework-jwt -i https://mirro
rs.aliyun.com/pypi/simple/ spyder
代码:
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('login',obtain_jwt_token)

]

image

image

定制返回格式

# 如果是基于auth的User表签发token,就可以不自己写了,但是登录接口返回的格式,只有token,不符合公司规范
# 使用步骤
	1 写个函数:jwt_response_payload_handler
        def jwt_response_payload_handler(token, user=None, request=None):
            return {
                'code': 100,
                'msg': '登录成功',
                'token': token,
                'username': user.username
                # 'icon':user.icon
            }
    2 配置一下 ,项目配置文件
    JWT_AUTH = {
    	'JWT_RESPONSE_PAYLOAD_HANDLER':'app01.utils.jwt_response_payload_handler', 
	}
    
    3 使用postman测试,就能看到返回的格式了

image

image

jwt的认证类

# 以后接口要登录后才能访问的使用

	1 在视图类上加一个认证类,一个权限类class BookView(ViewSetMixin, RetrieveAPIView):
    	authentication_classes = [JSONWebTokenAuthentication]
    	permission_classes = [IsAuthenticated]  # 登录用户有权限,不登录用户没权限
	2 postman测试
    	-请求头中key值叫Authorization
        -请求头的value值是:  jwt 有效的token值