jwt认证
jwt认证
- cookie,session,token介绍
- jwt原理介绍
- base64编码和解码
- drf-jwt快速使用
- drf-jwt修改返回格式
- 自定义user表,签发token
cookie,session,token介绍
Cookie,Session,Token发展史
详情请点击https://www.cnblogs.com/liuqingzheng/p/8990027.html
Cookie,Session,Token的含义
- cookie是:存在客户端浏览器的键值对
- session是:存在于服务端的键值对
- token是:三段式,服务端生成的,存放在客户端(浏览器就放在cookie中,移动端:存在移动端中)
Cookie和Session详情
详情请点击https://www.cnblogs.com/nirvana001/p/16690657.html
Token
-
token的三段式
第一段:头:公司信息,加密方式。。。 {}
第二段:荷载:真正的数据 {name:jcs,id:1}
第三段:签名,通过第一段和第二段,通过某种加密方式加密得到的 aafasdfas
-
token的使用
token的使用分两个阶段:
1.登录成功后的【签发token阶段】---》生成三段
2.登录成功访问某个接口的 【验证阶段】---》验证token是否合法
-
使用token的认证机制,服务端还要存数据吗?
token是服务的生成,客户端保存,服务的不存储token
jwt的原理介绍
jwt(Json web token) 是 token 的应用于web方向的称之为jwt
JWT的构成
JWT由 header、 payload 、 signature 三部分构成
-
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
JWT的原理
JWT就是一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串
如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
注意事项
secret是保存在服务器端的(加密方式+盐),jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了
-
jwt使用流程最核心的是
签发:登录接口签发
认证:认证类认证
session认证机制和jwt认证机制的差别
-
session认证机制
) -
jwt认证机制
base64编码和解码
-
base64编码和解码的场景
base64多用于 jwt认证
网络中传输字符串就可以使用base64编码
网络中传输图片,也可能使用base64的编码
-
如何使用base64进行编码解码
-
字符串格式
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
将字典转成json字符串的形式
-
图片格式
import base64 #图片地址 img_path = 'D:xxx/file/img/juwan.jpg' # 编码 with open(img_path, 'rb') as f: image_data = f.read() base64_data = base64.b64encode(image_data) # base64编码 print(base64_data) print(type(base64_data)) """ 将编码后的数据转换为字符串,直接str(base64_data),字符串前还是会有 b ’ ’ 可以str(base64_data, ‘utf-8’) 去掉字符串前面的 b ’ ’ """ # 解码 with open('1.jpg', 'wb') as file: jiema = base64.b64decode(base64_data) # 解码 file.write(jiema) # 将解码得到的数据写入到图片中
-
drf-jwt快速使用
-
django中使用jwt
https://github.com/jpadilla/django-rest-framework-jwt (比较老)
https://github.com/jazzband/djangorestframework-simplejwt (比较新)
-
安装drf-jwt第三方插件
pip install djangorestframework-jwt
-
快速使用的步骤
1.迁移表,因为它默认使用auth的user表签发token
2.创建超级用户(auth的user表中要有记录)
3.不需要写登录接口,如果是使用auth的user表作为用户表,它可以快速签发
4.签发(登录):只需要在路由中配置(因为它帮咱们写好登录接口了)
-
创建超级用户
python3 manage.py createsuperuser
-
配置路由urls.py
from django.urls import path from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path('login/', obtain_jwt_token), ]
-
接口(postman)测试
向后端接口发送post请求,携带用户名密码,即可看到生成的token
-
settings配置
import datetime JWT_AUTH = { # 过期时间1天 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # 自定义认证结果:见下方序列化user和自定义response # 如果不自定义,返回的格式是固定的,只有token字段 'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler', }
-
认证(认证类):导入,配置在视图类上
class TestView(APIView): authentication_classes = [JSONWebTokenAuthentication,] permission_classes = [IsAuthenticated,]
-
前端访问时,token需要放在请求头中
Authorization:jwt token串
-
drf-jwt修改返回格式
-
如何修改drf-jwt的返回格式
写一个函数,函数返回什么,前端就看到什么,配置在配置文件中
-
具体步骤
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)
写一个登录接口
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('用户名或密码错误')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异