如何实现Django与Vue的前后端分离认证_利用Python的DRF扩展Token鉴权

阿强大大_8268

阿强大大_8268

2026-07-22

339人浏览

原创

drf的tokenauthentication不能直接用于vue单页应用,因其依赖手动注入authorization头、不支持token过期与刷新,且缺乏配套登录视图;应改用djangorestframework-simplejwt,配合axios拦截器、sessionstorage存储及后端jwt配置。

如何实现django与vue的前后端分离认证_利用python的drf扩展token鉴权

DRF的TokenAuthentication为什么不能直接用于Vue单页应用

因为 TokenAuthentication 默认依赖 HTTP 请求头中的 Authorization: Token xxx,而 Vue 前端发起请求时不会自动携带该头——它不像 Django 模板渲染那样能隐式注入 CSRF 和 session 信息。更关键的是,原生 TokenAuthentication 不支持 Token 过期、刷新、用户绑定设备等常见需求,一用就卡在登录后 401 或跨域请求被拒。

实操建议:

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载
  • 别直接用 rest_framework.authentication.TokenAuthentication,它只是个基础验证器,没配套的登录/登出视图和 Token 生命周期管理
  • 改用 djangorestframework-simplejwt(推荐)或 drf-token-refresh,它们提供标准的 /api/token/、/api/token/refresh/ 接口,Vue 可以用 Axios 统一拦截器注入 Authorization 头
  • 确保 Django 的 CORS_ORIGIN_WHITELIST(或 CORS_ALLOWED_ORIGINS)包含 Vue 开发服务器地址,比如 "http://localhost:5173",否则预检请求(OPTIONS)直接失败
  • 前端必须手动保存 Token 到 localStorage 或 sessionStorage,且每次请求前读取并设置 headers.Authorization = `Bearer ${token}`

Vue 中如何安全地存储和传递 JWT Token

localStorage 看似方便,但 XSS 攻击可直接读取;放在 Cookie 里又得处理 HttpOnly 和 SameSite 限制。折中方案是:用 sessionStorage 存 Token + Axios 请求拦截器统一注入,同时后端设置 Token 短期有效(如 15 分钟),强制前端调用 /api/token/refresh/ 获取新 Token。

实操建议:

  • 登录成功后,把响应里的 access 和 refresh 字段分别存入 sessionStorage:sessionStorage.setItem('access_token', response.data.access)
  • Axios 全局请求拦截器中读取:config.headers.Authorization = 'Bearer ' + sessionStorage.getItem('access_token'),注意判空避免 401 泛滥
  • 对 401 响应做单独拦截:若错误是 "Token is invalid or expired",则用 refresh Token 尝试续期;失败再跳转登录页
  • 不要在 Vue Router 的 beforeEach 里反复读取 Token 并校验——那是后端的事,前端只负责透传

Django 后端如何配置 simplejwt 并兼容 Vue 跨域请求

simplejwt 默认返回的 Token 不带过期时间字段,Vue 很难做自动刷新判断;另外它的默认签名密钥是硬编码的 SIMPLE_JWT['SIGNING_KEY'],生产环境必须替换为环境变量读取的密钥,否则部署多实例时 Token 校验会失败。

实操建议:

  • 安装后,在 settings.py 中配置:SIMPLE_JWT 字典必须显式定义 'ACCESS_TOKEN_LIFETIME' 和 'REFRESH_TOKEN_LIFETIME',单位是 timedelta,例如 timedelta(minutes=15)
  • 加上 'AUTH_HEADER_TYPES': ('Bearer',),否则 Vue 发送 Authorization: Bearer xxx 会被忽略
  • 在 urls.py 中注册路由:path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),并确保该视图返回的 JSON 包含 access、refresh、user_id(需自定义序列化器)
  • 如果 Vue 部署在独立域名(如 app.example.com),Django 必须开启 CORS_ALLOW_CREDENTIALS = True,且前端 Axios 配置 withCredentials: true,否则 Cookie 中的 session 无法共享(虽然 Token 认证不用 Session,但某些调试场景会混用)

为什么登录后 Vue 能拿到 Token 却始终 403 —— 权限类没配对

TokenAuthentication 或 JWTAuthentication 只负责「识别用户是谁」,不等于「允许访问」。如果你在 ViewSet 中写了 permission_classes = [IsAuthenticated] 却没启用认证类,或者用了 SessionAuthentication 但前端没传 sessionid Cookie,就会返回 403 而非 401,让人误以为是权限问题。

实操建议:

  • 检查视图的 authentication_classes 是否显式声明了 [JWTAuthentication](来自 simplejwt)或 [TokenAuthentication](来自 DRF),不能只靠全局配置,局部覆盖容易遗漏
  • 确认 DEFAULT_AUTHENTICATION_CLASSES 在 settings.py 中已替换掉默认的 SessionAuthentication,例如:'rest_framework_simplejwt.authentication.JWTAuthentication'
  • 用 curl 手动测试接口是否生效:curl -H "Authorization: Bearer <your-token>" http://localhost:8000/api/test/</your-token>,排除前端 JS 逻辑干扰
  • 如果用了自定义 Permission 类(比如基于用户角色),确保它继承自 BasePermission 而非 permissions.IsAuthenticated,后者在未认证时返回 401,而前者可能静默拒绝
Vue 侧 Token 刷新逻辑和后端 Token 校验密钥一致性,是最容易被跳过的两个点。尤其上线后换密钥却忘了重发所有活跃 Token,会导致大量用户“莫名登出”。

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

相关专题

更多
python是前端还是后端
python是前端还是后端

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

2023.08.11

2303

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6070

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5406

10

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

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

2023.07.20

1671

4

python能做什么
python能做什么

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

2023.07.25

4164

7

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

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

2023.07.31

1669

3

python教程
python教程

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

2023.08.03

24157

23

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

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

2023.08.04

2947

5

python eval
python eval

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

2023.08.04

2987

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习

Django 教程
Django 教程

共28课时 | 9.8万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习