首页 > 其他分享 >Django drf jwt token认证前后端使用流程

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

时间:2024-10-19 14:53:32浏览次数:7  
标签:jwt JWT Token refresh Django access token data

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

后端部分

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

    pip install djangorestframework djangorestframework-simplejwt
    
  2. 配置 Django 项目:
    settings.py 文件中,添加 JWT 相关的配置。

    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 相关的路由:

    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 访问。

    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/ 端点。

    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 头中。

    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 是否过期,并在必要时进行刷新。

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

标签:jwt,JWT,Token,refresh,Django,access,token,data
From: https://blog.csdn.net/cm_panpan/article/details/143078548

相关文章

  • 【Python技术之Django精品教学】第11课--Python Django 迁移
    PythonDjango迁移没有这样的表?-product/models.py中定义的类仅仅是我们的数据库的概念,但它并没有在数据库中创建任何表。我们可以认为类Phone是概念性的模式。在创建任何表之前,如果我们试图访问创建前的表,它将抛出这样的错误。OperationalErrorat/admin/product/phone/......
  • 【Python技术之Django精品教学】第13课--Django模型集–2
    Django模型集–2模型字段–模型字段定义了将被存储在所提供的变量中的数据类型。要存储价格,整数类型更适合。要存储高度、长度等,浮动/十进制类型更合适。要存储标题或标题,最好是提供字符限制。对于写一篇文章,最好有一个没有字符限制的文本框。示例:Price=models.Integer......
  • 大数据毕业设计基于python的京东食品数据分析和可视化django+可视化大屏分析
    文章目录前言详细视频演示一、项目介绍二、功能介绍三、核心代码数据库参考四、效果图五、文章目录前言  基于Python的京东食品数据分析和可视化项目涉及多个步骤,包括数据收集、数据清洗、数据分析以及数据可视化。由于直接获取京东食品数据的API可能受限或需要......
  • python+vue基于django/flask的在线投票管理系统java+nodejs-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • python+vue基于django/flask的美食分享推荐系统Java+nodejs-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • 微信小程序python flask django火锅店点餐订餐系统
    目录项目介绍具体实现截图技术介绍HBuilderX协同过滤算法java类核心代码部分展示其他springboot项目推荐详细视频演示源码获取项目介绍火锅店点餐系统,主要包括管理员与用户二个权限角色,对于用户角色不同,所使用的功能模块相应不同。本文从管理员、用户的功能要求出发......
  • 博客-django--路由分发--找不到app的views--解决办法
    博客-django--路由分发--找不到app的views--解决办法bash先给出我的项目文件目录结构主要是主目录project与app01省略了migrations问题问题出现在路由分发中以下是主urls以下是app的urls解决方式需要使用相对路径.思考其实正常的话使用绝对路径也可以,如参考代码mysite2项目---目......
  • 【开题报告】基于django+vue汽车租赁系统设计与实现(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人们生活水平的提高,汽车租赁作为一种便捷、灵活的出行方式,逐渐受到广大消费者的青睐。传统的汽车租赁模式存在信息......
  • 毕业设计:python车牌识别系统 HyperLPR车牌识别(深度学习) 可视化 Django框架 大数据毕业
    python车牌识别系统HyperLPR车牌识别(深度学习)可视化Django框架✅1、项目介绍技术栈:Python语言、Django框架、MySQL数据库、HyperLPR库车牌识别(深度学习)、Echarts可视化系统功能:车牌号码识别,车牌所属省份,再给他搞个各省统计分析,柱状图,折线图这些、各省份地图、注......
  • 【开题报告】基于django+vue停车场管理系统设计与实现(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着城市化进程的加快,城市停车问题日益严重。传统的停车场管理方式存在诸多弊端,如管理效率低下、资源利用率低、用户体验差等。近年来,智能......