首页 > 其他分享 >token机制详解,JWT的使用

token机制详解,JWT的使用

时间:2022-10-12 21:37:12浏览次数:73  
标签:JWT jwt token session cookie 签发 详解 客户端

cookie,session、token介绍

参考文章:https://www.cnblogs.com/liuqingzheng/p/8990027.html

存储在用户端的一-小段文本,用于服务器识别用户的一种技术。

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

session:

基于cookie,只是数据不存储在客户端,改为存储在服务器端,用户端只存储一个id ,也称为session id ,服务器可以根据这个session. id找到该用户的信息。

服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。

cookie和session的区别

session是存储服务器端,cookie是存储在客户端,所以session的安全性比cookie高

获取session里的信息是通过存放在会话cookie里的session id获取的。而session是存放在服务器的内存中里,所以session里的数据不断增加会造成服务器的负担,所以会把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里。

session的信息是通过sessionid获取的,而sessionid是存放在会话cookie中

当浏览器关闭的时候会话cookie消失,所以sessionid也就消失了,但是session的信息还存在服务器端,只是查不到所谓的session,但它并不是不存在

token:

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。

1.token三段式:
	第一段:头--> 存放公司信息、加密方式...
	第二段:荷载--> 存放真正的用户数据--> {'name':xxx, 'pwd':xxx}...
	第三段:签名--> 第一段和第二段的数据通过某种加密方式加密码得到的字符串
2.token的使用分为两个阶段:
	签发阶段--> 登录成功之后,服务器根据登录信息,加密之后生成token签发给浏览器,浏览器将这个token存在本地,下次登录时带上。
	验证阶段--> 浏览器带着用户数据和老token(之前s签发给b的token串)给服务端,服务端根据用户数据生成新token,与老token做对比,两者一样说明token没有被篡改,正常登录。
3.三者区别
    cookie是:存在客户端浏览器的键值对
    session是:存在于服务端的键值对
    token是:三段式,服务端生成的,存放在客户端(浏览器就放在cookie中,移动端存放在硬盘)

token的认证过程

1 用户通过用户名和密码发送请求
2 程序验证
3 程序返回一个签名的 token 给客户端
4 客户端储存 token, 并且每次请求都会附带它
5 服务端验证 token 并返回数据

问:使用token的认证机制,服务端还要存数据吗?

答:token是服务的生成,客户端保存,服务端不存储token,只需要提供加密方式和盐即可。

1.png

2.png

原理介绍

Json web token (JWT):token的应用于web方向的称之为jwt

JWT就是一段字符串,由三段信息构成,江浙三段信息用 . 连接在一起就构成了JWT字符串
就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT构成介绍

# header : 头部
	1.声明类型:是一个JWT字符串
	2.声明加密算法:一般都是 HMAC、SHA256
	3.存放公司信息:(可有可无)
	4.用base64转码
        例如:由 {'typ': 'JWT', 'alg': 'HS256'} 变成了
        eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# payload : 荷载
	1. exp: 表示jwt的过期时间,必须要大于签发时间
	2. iat: 表示jwt的签发时间
	3. 用户信息:id、name...
	4. base64编码:
		例如: 由{'exp': xxx, 'iat': xx, 'userid': xx, 'name': xx} 变成了
		eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
# signature : 签名
	把头和荷载加密再转码后得到的
		例如:TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

# 注意:secret(密钥:加密方式+盐)是保存在服务器的,jwt的签发也是由服务端完成。secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

 # jwt使用流程最核心的是:
    -签发:登录接口签发
    -认证:认证类认证

3.png

4.png

base64编码和解码

可以将字符串编码成base64格式:(包含大小写字母、数字和 = )
应用场景:
	-jwt中使用
	-用于网络中传输字符串、图片
    
编码、解码实操:
import json
import base64
d = {'name': 'lqz', 'userid': 6, 'age': 19}
info = json.dumps(d)
print(info)
# 把字符串使用base64编码
res=base64.b64encode(info.encode('utf-8'))
print(res)  # eyJuYW1lIjogImxxeiIsICJ1c2VyaWQiOiA2LCAiYWdlIjogMTl9

drf-jwt快速使用

签发-->登录接口
认证-->认证类
djangorestframework-jwt 或 djangorestframework-simplejwt

安装:pip3 install djangorestframework-jwt
快速使用:
	1.迁移表:以为他默认使用auth的user表签发token
	2.创建超级用户:auth的user表中要有记录
	3.如果使用auth的user表作为用户表,可以快速签发-->不需要编写登录接口了
	4.签发:(登录)只需要在路由中配置一句话,因为它已经帮我们写完了登录接口
        urls.py:
            from rest_framework_jwt.views import obtain_jwt_token
            urlpatterns = [
                path('login/', obtain_jwt_token),
            ]
	5.认证:导入,配置在视图类上
        views.py:
            class TestView(APIView):
                authentication_classes = [JSONWebTokenAuthentication,]
                permission_classes = [IsAuthenticated,]
                # 加了这两个认证/权限类之后,TestView就必须登录(携带token)之后才能访问
注意:前端访问时携带的token要放在请求头中
	Authorization:jwt token串  # 'jwt空格' 必须加上

drf-jwt修改返回格式

登录成功之后,前端看到的返回数据只有token串,我们想让他多返回一些数据
例如:{code:100,msg:'登录成功',token:adfasdfasdf}

# 固定写法:写一个函数,函数返回什么,前端就看到什么

# 使用步骤:
	1.写一个函数:
	def jwt_response_payload_handler(token, user=None, request=None):
        return {
            'code':100,
            'msg':'登录成功',
            'username':user.username,
            'token':token
        }    
	2.将函数配置在配置文件中
	JWT_AUTH={
        'JWT_RESPONSE_PAYLOAD_HANDLER':
        'app01.response.jwt_response_payload_handler',
    }
 # 以后登录接口返回的格式就是咱们写的函数的返回值

自定义user表,签发token

# models.py 中定义UserInfo表

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

# 写一个登录接口,签发token
from rest_framework.exceptions import APIException
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
from .models import UserInfo


class UserView(APIView):
    def post(self, request):
        try:
            username = request.data.get('username')
            password = request.data.get('password')
            user=UserInfo.objects.get(username=username,password=password)
            # 根据user,签发token---》三部分:头,荷载,签名
            # 使用djagnorestframework-jwt模块提供的签发token的函数,生成token
            payload = jwt_payload_handler(user) # 通过user对象---》{username:lqz,id:1,过期时间}
            token = jwt_encode_handler(payload) # 根据payload---》得到token:头.荷载.签名
            print(payload)
            print(token)

            return Response({'code':100,'msg':'登录成功','token':token})
        except Exception as e:
            raise APIException('用户名或密码错误')

标签:JWT,jwt,token,session,cookie,签发,详解,客户端
From: https://www.cnblogs.com/jixing-index/p/16786081.html

相关文章

  • 【NLP-词向量】从模型结构到损失函数详解word2vec
    上周我们讲到,在进行NNLM训练时,能够得到副产品,词向量。本文介绍一种专门用于词向量制备的方法:word2vec,利用它能够高效的训练出词向量。作者&编辑|小Dream哥1word2vec是什......
  • java.class.path详解
    java中System.properties的一个属性“java.class.path”(系统类加载器加载字节码class的路径)的获取及详解:获取packagecom.yoyo.yotils.yoyo.system;importorg.apach......
  • cookie,session,token介绍,jwt原理介绍,base64编码和解码,drf-jwt快速使用,drf-jwt修改返
    1.cookie,session,token介绍这三者之间是有联系的,在互联网发展初期先有了cookie,在发展的过程中,因为出现了登录,还有购物车等功能,这是http的请求是无状态的,这是要解决这个问......
  • 【GAN优化外篇】详解生成模型VAE的数学原理
    最近在学习生成模型的相关知识,这篇文章将介绍一下变分自编码器(VariationalAuto-encoder),本文只介绍一些粗浅内容,不会涉及比较深刻的问题。作者&编辑|小米粥1. 自编码器......
  • 【GAN优化】详解GAN中的一致优化问题
    GAN的训练是一个很难解决的问题,上期其实只介绍了一些基本的动力学概念以及与GAN的结合,并没有进行过多的深入。动力学是一门比较成熟的学科,有很多非常有用的结论,我们将尝试将......
  • 【GAN优化】详解对偶与WGAN
    越学习越发现自己知之甚少,道阻且长,还是认真看下这篇文章,好好琢磨琢磨GAN吧。今天将和大家一起学习在GAN界占有重要位置的WGAN,它提出了一种新的距离度量,较之前的f散度,它的数......
  • 详解线性分类-朴素贝叶斯分类器(Naive Bayes Classifer)【白板推导系列笔记】
    朴素贝叶斯是对数据属性之间的关系进行了假设,即各个属性维度之间独立。 NB中我们假设$X$是离散的,服从多项分布(包括伯努利)。GDA的$X$可以用多维高斯分布表示,但是在NB中我......
  • MySQL详解
    MySQL1.初识mysqlJavaEE:企业级Java开发Web前端(页面:展示:数据)后台(连接点:连接数据库JDBC,连接前端(控制视图跳转,给前端传递数据))数据库(存数据,Txt,Excel,Word)只会写......
  • Linux Epoll 详解
       Epoll作为Linux系统中的核心武器之一,在高吞吐、高并发的IO系统中经常遇见Epoll的身影,列如Redis、Nginx、Skynet等都使用到了IO多路复用技术。我们可以先创建一个e......
  • parted命令详解
    Parted是一个比fdisk更高级的工具,它支持多种分区表格式,包括MS-DOS和GPT。它允许用户创建,删除,调整大小,缩小,移动和复制分区,重新组织磁盘使用,以及将数据复制到新硬盘,但在缩小......