首页 > 其他分享 >drf day09 接口文档、jwt快速使用、自定义jwt的登录返回数据格式

drf day09 接口文档、jwt快速使用、自定义jwt的登录返回数据格式

时间:2023-02-09 20:58:11浏览次数:40  
标签:请求 自定义 base64 jwt token 数据格式 服务端 客户端

一、接口文档

1.前言

​ 因为一般来说,项目都是前后端分离,我们作为后端工程师,就写接口就行,但是我们通过接口返回给前端的数据,前端可不知道都是些啥,所以就需要后端编写接口文档,文档中说明接口的地址啊,变量名解释啊,返回格式案例.....之类的

2.编写方式

  • 1.自己用文本编辑软件手撸
  • 2.使用第三方平台的,一般都是收费的
  • 3.公司内部自己搭建的平台
  • 4.drf自动生成的

3.drf自动导出文档——coreapi

1.先安装
	pip install coreapi -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/
        
2.加一条路由,让以后访问某个地址就显示文档
        from rest_framework.documentation import include_docs_urls
        path('docs/', include_docs_urls(title='xx项目接口文档')),
3.在视图层的类下(方法上),加注释
4.项目那个配置里面添加一条
 	REST_FRAMEWORK = {
     		'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',

    	}
5.可以了,去访问http://127.0.0.1:8000/docs就可以看到

二、关于cookie、session、token

1.早期互联网无状态http协议

​ 是指协议对于事务处理没有记忆能力,之前做了啥完全记不住,每次请求过来了,服务端都当是崭新的请求,打个比方,刷新一次网页或者跳转到相关网页都要登录一次。

img

2.cookie

​ cookie 是保存在客户端或者说浏览器中的一小块数据,大小一般在 4KB或者8KB 左右

浏览器每次请求会携带 cookie 在请求头中,不支持直接储存中文,而且不安全,很容易被截获查看

流程:

​ 1.客户端朝服务端发请求,服务端响应了请求,并在响应头中设置 Set-Cookie,把Set-Cookie给予服务端

​ 2.客户端发送其他请求,并自动携带Cookie

​ 3.服务端验证Cookie,验证通过则正常响应请求

一句话:类似去小餐馆吃饭,前台给了一个号牌,后续上菜根据号牌来上菜

3.session

​ session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识,如果包

含了 sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session,如果没

找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 给

客户端,通常是存储在 cookie 中。如果在请求中找到了真正的 session,验证通过,正常处理该请求。

format,png

一句话:

​ 类似cookie,但是session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的

4.token

​ token 其实就是一串被加密后的字符串,它通常使用 uid(用户唯一标识)、时间戳、签名以及一些其

它参数加密而成。我们将 token 进行解密就可以拿到诸如用户 uid 这类的信息,然后通过 uid 来进行接

下来的鉴权操作。

token 认证流程:
  1. 客户端发起登录请求,比如用户输入用户名和密码后登录。
  2. 服务端校验用户名和密码后,将用户 id 和一些其它信息进行加密,生成 token。
  3. 服务端将 token 响应给客户端。
  4. 客户端收到响应后将 token 存储下来,一般手机端储存在手机本地
  5. 下一次发送请求后需要将 token 携带上,比如放在请求头中或者其它地方。
  6. 服务端 token 后校验,校验通过则正常返回数据。

三、JWT

1.介绍——json web token

​ 本质就是给用户创建身份认证的凭证,用来记录用户登录状态

2.构成

​ 头部、荷载、签名,三段式

头部
头部一般放:
{
    声明类型,这里是jwt
	声明加密算法,通常直接使用HMAC SHA256
	[有些公司的项目会把公司信息写进去]

}
荷载
存放用户信息的地方
{
    用户名啊
    用户ID啊
    过期时间啊
    ....
    
}
签名
通俗解释:
	把头和荷载加密后跟在第一段第二段后面,就是签名
    
    
怎么理解呢?
	服务端通过某种算法和密钥,加密了头部和荷载,得到了一串字符,这个字符就是对应头部和荷载,
这个签名结果,服务端为了缓解压力不保存,下次客户端带token过来,服务端又会拿着一样的算法和密钥,再次加密服务端携带的头部和荷载,加密的结果如果和签名不一致,那就证明数据部分肯定被篡改了,就是签名验证失败

3.base64编码和解码(简单)

​ 是pycharm自带的模块,能把数据转成一长串字符

​ 只能编码二进制的数据

​ base64.b64encode ——编码

​ base64.b64decode ——解码

​ base64结果长度必须是4的倍数,如果解码不够就自己加点=

# 实操
import json
import base64
t = 'jason'
res = json.dumps(t)
a = base64.b64encode(res.encode('utf-8'))
print(a)
print(json.loads(base64.b64decode(a).decode('utf-8')))
>>>>>
b'Imphc29uIg=='    # base64结果长度必须是4的倍数,不够会用==补齐,=没实际意义
jason

​ 网络传输也可能用base64编码,比如说12306的图片验证码

c = "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"
res = base64.b64decode(c)
with open('a.jpg','wb')as f:
    f.write(res)

四、drf-jwt快速使用

​ 在django的drf应用中,签发jwt有两个模块,能完成快速签发

​ 一个是djangorestframework-jwt >>> 已经不维护了,但是可以用

​ 一个是simplejwt >>>目前主流

djangorestframework-jwt稍微聊两句

​ 这个模块,甚至登录接口都不用自己写了,他基于auth的用户表自己就写好了

使用步骤

先pip下载
1.路由层
	from rest_framework_jwt.views import obtain_jwt_token
    # 配置一下路由
    path('login/',include(router.urls)),
2.创建一个超级用户,就是使用auth的user表,自己记住账号密码待会要用
3.用POSTMAN朝login地址发POST请求,携带用户名和密码,K一定要是username和password哦
4.发现返回一个token
5.拿荷载出来,去解一下码,发现是b'{"user_id":1,"username":"gao15679","exp":1675942787,"email":""}'这样的信息

五、定制返回格式

​ 因为上图,登录的返回格式太不规范,要搞一下

步骤:

1.写一个函数,格式就照抄源码的,这个函数返回啥,前端就得到啥,这样就完成定制
# from rest_framework_jwt.utils import jwt_response_payload_handler,不要导,这里只是导一下看看里面的方法
def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'code':100,
        'message':'登录成功',
        'token':token,
        'username':user.usernam

    }
2.项目配置中配置一下
JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.jwt.jwt_response_payload_handler',
}

# V就是自己写的函数的路径,别无脑复制哦!
3.测试,无问题

六、jwt的认证类

​ 甚至认证我们也不用自己写,用jwt的

步骤:

1.视图层导一下,配一下
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
2.要配合drf的一个权限类一起使用,在类中都配一下那个认证和权限列表[]
from rest_framework.permissions import IsAuthenticated
# 注意,这个类很怪,只抓体制内的(登录过的),登录过的有权限,没有登录的他不管
3.postman测试,必须遵循下面两规范
    	-请求头中key值叫Authorization
        -请求头的value值是:  jwt 有效的token值

今日注意

1.encode是编,decode是解
2.今天的jwt大多类都从rest_framework_jwt导

标签:请求,自定义,base64,jwt,token,数据格式,服务端,客户端
From: https://www.cnblogs.com/wznn125ml/p/17106998.html

相关文章

  • jwt原理以及使用
    jwt原理以及使用cookie和sessionJsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适......
  • drf-day9——接口文档、cookie.session.token发展史、jwt介绍及工作原理、drf-jwt模块
    目录一、接口文档使用coreapi自动生成接口文档步骤代码两点说明二、cookiesessiontoken发展史(彻底理解cookie,session,token,便于理解jwt)1、Cookie,Session,Token发展史2、......
  • 接口文档,jwt介绍和原理,drf-jwt快速使用,定制返回格式,jwt的认证类
    目录接口文档jwt介绍和原理drf-jwt快速使用定制返回格式jwt的认证类接口文档#前后端分离 -我们做后端,写接口-前端做前端,根据接口写app,pc,小程序-作为后端来......
  • drf之jwt
    接口文档#前后端分离 -我们做后端,写接口 -前端做前端,根据接口写app,pc,小程序 -作为后端来讲,我们很清楚,比如登录接口,api/v1/login/ ---》是post请求,发送use......
  • 接口文档 token发展史 jwt介绍和原理 drf-jwt快速使用
    目录昨日回顾认证权限频率全局异常处理接口文档接口文档编写drf自动生成接口文档cookies-session-token发展史jwt介绍和原理jwt的构成base64的编码和解码drf-jwt快速使用安......
  • drf(10)jwt
    1接口文档#前后端分离-我们做后端,写接口-前端做前端,根据接口写app,pc,小程序-作为后端来讲,我们很清楚,比如登录接口/api/v1/login/---->post---->us......
  • rest_framework_jwt源码分析
    rest_framework_jwt源码分析之序列化类序列化类classJSONWebTokenSerializer(Serializer):def__init__(self,*args,**kwargs): #这里是给序列化类的对象,添......
  • 40-自定义异常
    使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。在程序中使用自定义异常类,大体......
  • 音乐播放器 — 用 vant4 中的滑块自定义播放器进度条
    一、运行效果   二、代码实现2.1、HTML:<!--音频播放器--><audioref="audio"src="音乐名称.mp3"id="audio"></audio><!--进度条--><di......
  • jwt用法
    JWT认证全称:Jsonwebtoken(JWT)主要用于web方向token的使用JWT由来https://www.cnblogs.com/liuqingzheng/p/8990027.htmltoken的签发认证流程JWT的构成#分为三......