怎样在Python Django中实现基于JWT的无状态身份验证?

陌雪大大_7395

陌雪大大_7395

2026-07-13

294人浏览

原创

直接使用djangorestframework-simplejwt而非手写jwt逻辑,因其已完备支持exp/iat/nbf校验、密钥轮换、黑名单机制,并持续适配django版本;手写易遗漏关键安全细节。

怎样在python django中实现基于jwt的无状态身份验证?

为什么直接用 djangorestframework-simplejwt 而不是手写 JWT 逻辑?

手写签发、校验、刷新逻辑容易漏掉关键细节:比如 exp 校验未强制、iat 和 nbf 忽略、密钥轮换无支持、黑名单机制缺失。社区方案已覆盖这些边界,且持续适配 Django 版本变更。直接集成 djangorestframework-simplejwt 是更稳妥的选择。

安装后需在 settings.py 中配置:

INSTALLED_APPS += ['rest_framework_simplejwt']<br><br>REST_FRAMEWORK = {<br>    'DEFAULT_AUTHENTICATION_CLASSES': [<br>        'rest_framework_simplejwt.authentication.JWTAuthentication',<br>    ],<br>}<br><br>from datetime import timedelta<br>SIMPLE_JWT = {<br>    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),<br>    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),<br>    'ROTATE_REFRESH_TOKENS': True,<br>    'BLACKLIST_AFTER_ROTATION': True,<br>}

如何让登录接口返回 access + refresh token 并支持前端存储?

默认的 TokenObtainPairView 只返回 access 和 refresh 字段,但前端通常需要明确字段名、HTTP 状态码和可选的用户信息。建议继承并重写响应结构:

from rest_framework_simplejwt.views import TokenObtainPairView<br>from rest_framework_simplejwt.serializers import TokenObtainPairSerializer<br><br>class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):<br>    def validate(self, attrs):<br>        data = super().validate(attrs)<br>        data['user_id'] = self.user.id<br>        data['email'] = self.user.email<br>        return data<br><br>class CustomTokenObtainPairView(TokenObtainPairView):<br>    serializer_class = CustomTokenObtainPairSerializer

路由中注册该视图,前端调用后即可拿到含用户基础信息的 token 响应。注意:不要把敏感字段(如密码哈希、权限列表)塞进 token payload,应在后续请求中按需查库。

刷新 token 时遇到 Token is blacklisted 怎么办?

这个错误通常出现在启用了 ROTATE_REFRESH_TOKENS=True 后,客户端重复使用旧 refresh token 请求新 access token。原因包括:

Python Use Agent
Python Use Agent

智能执行Python任务,自动生成、执行代码并反馈结果,无需额外配置,兼容旧命令。

下载
  • 前端未及时用新返回的 refresh 替换本地存储的旧值
  • 并发请求中多个请求同时用同一个 refresh 触发了黑名单写入
  • BLACKLIST_AFTER_ROTATION 开启后,旧 token 立即失效,无法二次使用

解决方式:

  • 确保前端在每次成功刷新后,用响应体中的新 refresh 覆盖本地存储
  • 对刷新请求做防抖或串行化处理(例如用 Promise 链或锁机制)
  • 若业务允许,可临时关闭 BLACKLIST_AFTER_ROTATION,但会牺牲安全性

如何在非 API 视图(如通用类视图或模板视图)中获取当前 JWT 用户?

JWTAuthentication 默认只作用于 DRF 的 APIView 及其子类,普通 View 或模板视图不会自动解析 Authorization header。不能依赖 request.user,必须手动解码:

from rest_framework_simplejwt.tokens import AccessToken<br>from django.contrib.auth.models import User<br><br>def my_view(request):<br>    auth_header = request.META.get('HTTP_AUTHORIZATION')<br>    if not auth_header or not auth_header.startswith('Bearer '):<br>        return HttpResponseForbidden()<br>    try:<br>        token = auth_header.split(' ')[1]<br>        validated_token = AccessToken(token)<br>        user_id = validated_token['user_id']<br>        user = User.objects.get(id=user_id)<br>    except Exception:<br>        return HttpResponseForbidden()<br>    # 继续业务逻辑

注意:AccessToken 不校验 refresh token;若需支持双 token 场景,应统一用 RefreshToken 类并调用其 access_token 属性;生产环境务必捕获 TokenError、InvalidToken 等具体异常,而非宽泛的 Exception。

JWT 的无状态本质意味着所有校验都在内存中完成,不查数据库——但这也导致你无法在 token 有效期内主动使某个用户登出,除非引入 Redis 黑名单或缩短 ACCESS_TOKEN_LIFETIME。这点常被忽略,直到遇到强制下线需求才意识到代价。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1611

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3924

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1629

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

22597

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2787

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2827

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1123

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2183

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程