解析jwt实现原理
哔哩哔哩视频教学笔记:
1.jwt(登录注册)
json web token,一般用于用户认证(前后端分离、微信小程序/APP开发) 其他直接用cookies/session即可
token的校验过程:
前端——携带token进行认证——后端———返回携带的token进行校验
基于传统的token认证:
# 用户登录,服务段返回token,并将token保存在服务器,以后用户再来访问时,需要携带token,服务端获取token后再去数据库中获取token进行校验。
jwt:
# 用户登录,服务端给用户返回一个token(服务器不保存), 以后用户再来访问,需要携带token,服务器获取token后,再做token的校验, 优势:相较于传统的token相比,它无需在服务器端保存token。
2.jwt实现过程
*第一步瀛湖提交用户和密码给服务端。如果登录成功,使用创建一个token,并给用户返回。
官网:
注意:jwt生成的token由三段字符串组成,并用.连接起来的。
*第一段字符串,HEADER,内部包括算法/token类型,
json转换成字符串,然后做base64url加密(base64加密:+_).
{ "alg":"HS256", "typ":"JWT" }
*第二段字符串,payload自定义值。
json转换成字符串,然后做base64url加密(base64加密:+_).
{ "id":"123123", "name":"Eric", "exp":"124521589" # 超时时间 }
-
第三段字符串:
-
'''' 第一步:第1、2部分密文件拼接起来 第二步:对前2部分密文进行HS256加密 + 加盐 第三步:对HS256加密后的密文再做base64url加密 ''''
-
以后用户再来访问时候,需要携带token,后端需要对token进行校验
-
-
第一步:对token进行切割
-
第二部:对第二段进行base64url解密,并获取payload信息,检测token是否已经超时
{ "id":"123123", "name":"Eric", "exp":"124521589" # 超时时间 }
-
第三步:把第1,2段拼接起来,再次执行sah256加密
-
3.应用
# pip install pyjwt
使用:刨析内部源码
pyjwt.encode 生成token
pyjwt.decode token解密
4.扩展
# pip3 install djangoresframework-jwt
djangorestframework-jwt本质是调用pyjwt实现。
django案例
from django.http import JsonResponse from django.views import View from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from utils.jwt_auth import create_token @method_decorator(csrf_exempt, name='dispatch') class LoginView(View): def post(self, request, *args, **kwargs): """ 用户登录 """ user = request.POST.get('username') pwd = request.POST.get('password') # 检测用户和密码是否正确,此处可以在数据进行校验。 if user == 'wupeiqi' and pwd == '123': # 用户名和密码正确,给用户生成token并返回 token = create_token({'username': 'wupeiqi'}) return JsonResponse({'status': True, 'token': token}) return JsonResponse({'status': False, 'error': '用户名或密码错误'}) @method_decorator(csrf_exempt, name='dispatch') class OrderView(View): def get(self, request, *args, **kwargs): print(request.user_info) return JsonResponse({'data': '订单列表'}) def post(self, request, *args, **kwargs): print(request.user_info) return JsonResponse({'data': '添加订单'}) def put(self, request, *args, **kwargs): print(request.user_info) return JsonResponse({'data': '修改订单'}) def delete(self, request, *args, **kwargs): print(request.user_info) return JsonResponse({'data': '删除订单'})
drf_jwr_demo
#!/usr/bin/env python # -*- coding:utf-8 -*- import jwt import datetime from jwt import exceptions JWT_SALT = 'iv%x6xo7l7_u9bf_u!9#g#m*)*=ej@bek5)(@u3kh*72+unjv=' def create_token(payload, timeout=20): """ :param payload: 例如:{'user_id':1,'username':'wupeiqi'}用户信息 :param timeout: token的过期时间,默认20分钟 :return: """ headers = { 'typ': 'jwt', 'alg': 'HS256' } payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout) result = jwt.encode(payload=payload, key=JWT_SALT, algorithm="HS256", headers=headers).decode('utf-8') return result def parse_payload(token): """ 对token进行和发行校验并获取payload :param token: :return: """ result = {'status': False, 'data': None, 'error': None} try: verified_payload = jwt.decode(token, JWT_SALT, True) result['status'] = True result['data'] = verified_payload except exceptions.ExpiredSignatureError: result['error'] = 'token已失效' except jwt.DecodeError: result['error'] = 'token认证失败' except jwt.InvalidTokenError: result['error'] = '非法的token' return result
view.py
from rest_framework.views import APIView from rest_framework.response import Response from utils.jwt_auth import create_token from extensions.auth import JwtQueryParamAuthentication, JwtAuthorizationAuthentication class LoginView(APIView): def post(self, request, *args, **kwargs): """ 用户登录 """ user = request.POST.get('username') pwd = request.POST.get('password') # 检测用户和密码是否正确,此处可以在数据进行校验。 if user == 'wupeiqi' and pwd == '123': # 用户名和密码正确,给用户生成token并返回 token = create_token({'username': 'wupeiqi'}) return Response({'status': True, 'token': token}) return Response({'status': False, 'error': '用户名或密码错误'}) class OrderView(APIView): # 通过url传递token authentication_classes = [JwtQueryParamAuthentication, ] # 通过Authorization请求头传递token # authentication_classes = [JwtAuthorizationAuthentication, ] def get(self, request, *args, **kwargs): print(request.user, request.auth) return Response({'data': '订单列表'}) def post(self, request, *args, **kwargs): print(request.user, request.auth) return Response({'data': '添加订单'}) def put(self, request, *args, **kwargs): print(request.user, request.auth) return Response({'data': '修改订单'}) def delete(self, request, *args, **kwargs): print(request.user, request.auth) return Response({'data': '删除订单'})
本文来自博客园,作者:游走De提莫,转载请注明原文链接:https://www.cnblogs.com/Gaimo/p/12546259.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律