Django drf jwt token认证前后端使用流程

在 Django Rest Framework (DRF) 中使用 JWT (JSON Web Token) 进行认证时,前后端需要配合工作。下面是 DRF 使用 JWT 认证的一个基本流程。

后端部分

  1. 安装必要的库:

    需要安装 djangorestframeworkdjangorestframework-simplejwt 两个库。后者是处理 JWT 的工具。

    bash 复制代码
    pip install djangorestframework djangorestframework-simplejwt
  2. 配置 Django 项目:

    settings.py 文件中,添加 JWT 相关的配置。

    python 复制代码
    INSTALLED_APPS = [
        # 其他应用
        'rest_framework',
        'rest_framework_simplejwt',
    ]
    
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_simplejwt.authentication.JWTAuthentication',
        ),
    }
    
    # 可选:JWT 配置
    from datetime import timedelta
    SIMPLE_JWT = {
        'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
        'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
        'ROTATE_REFRESH_TOKENS': True,
        'BLACKLIST_AFTER_ROTATION': True,
    }
  3. 创建获取 JWT Token 的视图:

    你可以使用 SimpleJWT 提供的现成的视图来生成 token 和刷新 token。

    urls.py 中配置 JWT 相关的路由:

    python 复制代码
    from django.urls import path
    from rest_framework_simplejwt.views import (
        TokenObtainPairView,
        TokenRefreshView,
    )
    
    urlpatterns = [
        # 获取 JWT Token
        path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
        # 刷新 JWT Token
        path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ]
  4. 受保护的视图:

    对于需要认证的视图,你可以使用 DRF 的权限系统来确保这些视图只能通过有效的 JWT token 访问。

    python 复制代码
    from rest_framework.permissions import IsAuthenticated
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class ProtectedView(APIView):
        permission_classes = [IsAuthenticated]
    
        def get(self, request):
            return Response({"message": "This is a protected view."})

前端部分

前端负责与后端进行交互,发送请求获取 JWT token,并使用 token 访问受保护的 API。

  1. 发送登录请求获取 Token:

    用户登录时,前端需要发送用户的凭据(如用户名和密码)到后端的 /api/token/ 端点。

    javascript 复制代码
    async function login(username, password) {
        const response = await fetch('http://localhost:8000/api/token/', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                username: username,
                password: password,
            }),
        });
        const data = await response.json();
        if (response.ok) {
            // 保存 Access Token 和 Refresh Token
            localStorage.setItem('access_token', data.access);
            localStorage.setItem('refresh_token', data.refresh);
        } else {
            console.log('Login failed:', data);
        }
    }
  2. 使用 Token 访问受保护的资源:

    前端在访问受保护的 API 时,需要将 JWT Access Token 放到请求的 Authorization 头中。

    javascript 复制代码
    async function getProtectedResource() {
        const token = localStorage.getItem('access_token');
        const response = await fetch('http://localhost:8000/protected/', {
            method: 'GET',
            headers: {
                'Authorization': `Bearer ${token}`,
            },
        });
    
        if (response.ok) {
            const data = await response.json();
            console.log('Protected data:', data);
        } else {
            console.log('Failed to access protected resource');
        }
    }
  3. 刷新 Token:

    当 Access Token 过期时,可以使用 Refresh Token 获取新的 Access Token。前端需要定期检查 token 是否过期,并在必要时进行刷新。

    javascript 复制代码
    async function refreshToken() {
        const refreshToken = localStorage.getItem('refresh_token');
        const response = await fetch('http://localhost:8000/api/token/refresh/', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                refresh: refreshToken,
            }),
        });
        const data = await response.json();
        if (response.ok) {
            // 更新 Access Token
            localStorage.setItem('access_token', data.access);
        } else {
            console.log('Failed to refresh token:', data);
        }
    }

总结

  1. 后端使用 djangorestframework-simplejwt 处理 JWT 认证,配置好相关路由和权限保护。
  2. 前端通过登录接口获取 access_tokenrefresh_token,然后在调用受保护 API 时,在请求头中携带 Bearer access_token
  3. access_token 过期时,前端可以使用 refresh_token 获取新的 access_token

这样,前后端就可以通过 JWT 来实现安全的认证和授权流程。

相关推荐
love530love23 分钟前
【保姆级教程】阿里 Wan2.1-T2V-14B 模型本地部署全流程:从环境配置到视频生成(附避坑指南)
人工智能·windows·python·开源·大模型·github·音视频
Funcy40 分钟前
XxlJob 源码分析03:执行器启动流程
后端
He1955011 小时前
Go初级之十:错误处理与程序健壮性
开发语言·python·golang
和鲸社区2 小时前
《斯坦福CS336》作业1开源,从0手搓大模型|代码复现+免环境配置
人工智能·python·深度学习·计算机视觉·语言模型·自然语言处理·nlp
豌豆花下猫2 小时前
Python 潮流周刊#118:Python 异步为何不够流行?(摘要)
后端·python·ai
THMAIL2 小时前
深度学习从入门到精通 - LSTM与GRU深度剖析:破解长序列记忆遗忘困境
人工智能·python·深度学习·算法·机器学习·逻辑回归·lstm
wheeldown3 小时前
【数学建模】数据预处理入门:从理论到动手操作
python·数学建模·matlab·python3.11
秋难降3 小时前
SQL 索引突然 “罢工”?快来看看为什么
数据库·后端·sql
多打代码3 小时前
2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
python·算法
@CLoudbays_Martin113 小时前
为什么动态视频业务内容不可以被CDN静态缓存?
java·运维·服务器·javascript·网络·python·php