1.cookie,session,token介绍
这三者之间是有联系的,在互联网发展初期先有了cookie,在发展的过程中,因为出现了登录,还有购物车等功能,这是http的请求是无状态的,这是要解决这个问题,于是session就出来了,每次发送http请求的时候,都会带过来session,session说白了就是一段字符串,如果用了两个机器作为一个集群,此时在a机器申请的b机器不知道,要是a机器坏了就没办法保存,这是就把两个机器每隔一段时间复制一次,后来有个人提出来既然都要复制,那我们为什么不把session做一个新的,当有请求的时候让这两台机器去调用session就好了,这样做有个弊端,那就是如果session坏了,那不是所有人都要重新登录一遍,于是token就出来了,token就相当于一个令牌,只要调用这个令牌就是你在访问,就不用掉session,但是这样,如果别人可以伪造个token的话,那不是所有人都能用你这个token去发请求,于是自己加个一个令牌,然后用加密给所有token给加密了,这是只有我才知道这么秘钥,每当别人发请求的时候只有我才有这个秘钥,此时在进行解码,如果这个秘钥能解,那么我就知道登录了,这时可以直接取到他的id就能知道是这个人在操作了
2.jwt原理介绍
其实说白了jwt就是一串字符串,由三段构成,分别是头,载荷,令牌,最终显示的是这样的:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
# 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
3.base64编码和解码
import base64 import json w='123' w1 = json.dumps(w) #转换成json格式 s = base64.b64encode(w1.encode('utf-8')) #加密 print(s) s1 = base64.b64decode(s) #解密 print(s1)
4.drf-jwt快速使用
drf-jwt只能使用auth的user表来签发token,要是不用auth中的user来签发token则需要我们自己写个逻辑
同时用drf-jwt就不用我们写登录接口,因为他已经配置好登录接口了
在路由中写
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path('login/', obtain_jwt_token), ]
当前端访问时,我们需要写个视图类,然后在需要加个身份类验证,在加个是否登录的认证就行。
from rest_framework.views import APIView from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response class TestView(APIView): authentication_classes = [JSONWebTokenAuthentication, ] permission_classes = [IsAuthenticated, ] def get(self,request ): return Response('OK')
5.drf-jwt修改返回格式
需要从drf-jwt配制文件中找他原来的返回格式在'JWT_RESPONSE_PAYLOAD_HANDLER'这个后面,然后把他写的cv下来,return是自己加几个值就行,同时需要修改配制文件中的DATABASES,把这个字典name的value加个str,或者os.path.join就好
def jwt_response_payload_handler(token, user=None, request=None): return { 'code' : 101, 'user' : user.username, 'msg' :'登录成功', 'token': token } JWT_AUTH = {'JWT_RESPONSE_PAYLOAD_HANDLER' :'app01.request.jwt_response_payload_handler'}
标签:base64,jwt,token,session,import,drf From: https://www.cnblogs.com/shangxin-bai/p/16785311.html