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 来实现安全的认证和授权流程。

相关推荐
程序员岳焱1 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*1 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅2 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头2 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
小赖同学啊2 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼2 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
IT_10242 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
bobz9652 小时前
动态规划
后端
stark张宇3 小时前
VMware 虚拟机装 Linux Centos 7.9 保姆级教程(附资源包)
linux·后端
小陈phd3 小时前
李宏毅机器学习笔记——梯度下降法
人工智能·python·机器学习