Django实现接口token检测的实现方案

目录

    • **一、Token认证的实现思路**
    • **二、环境准备**
    • [**三、基于 Django REST Framework(DRF)的 Token 认证**](#三、基于 Django REST Framework(DRF)的 Token 认证)
      • [**1. 安装 Django REST framework**](#1. 安装 Django REST framework)
      • [**2. 添加到 Django 配置**](#2. 添加到 Django 配置)
      • [**3. 生成 Token 表**](#3. 生成 Token 表)
      • [**4. 创建 API 视图**](#4. 创建 API 视图)
      • [**5. 保护 API 端点**](#5. 保护 API 端点)
      • [**6. 测试 API**](#6. 测试 API)
    • [**四、自定义 Token 认证方案**](#四、自定义 Token 认证方案)
      • [**1. 自定义 Token 模型**](#1. 自定义 Token 模型)
      • [**2. 创建 Token 生成逻辑**](#2. 创建 Token 生成逻辑)
      • [**3. 中间件拦截 Token**](#3. 中间件拦截 Token)
      • [**4. 受保护的 API**](#4. 受保护的 API)
      • [**5. 测试**](#5. 测试)
    • **五、总结**

一、Token认证的实现思路

  1. 用户登录后生成Token:用户登录成功后,服务器生成一个Token,并返回给客户端。
  2. 客户端请求时携带Token:客户端在每次请求时,将Token放入HTTP请求头(Headers)中。
  3. 服务器端验证Token:Django后端解析请求中的Token,并验证其合法性。
  4. Token校验通过,允许访问接口;否则,返回未授权的错误信息。

二、环境准备

在Django项目中,我们可以使用rest_framework.authtoken或者自定义Token认证逻辑。这里介绍两种方式:

  1. 基于 Django REST framework(DRF) 的 Token 认证
  2. 自定义 Token 认证

三、基于 Django REST Framework(DRF)的 Token 认证

Django REST Framework 提供了现成的 Token 认证机制,下面是实现步骤。

1. 安装 Django REST framework

如果还未安装 Django REST framework,请使用 pip 安装:

sh 复制代码
pip install djangorestframework
pip install djangorestframework.authtoken

2. 添加到 Django 配置

settings.py 中启用 Django REST framework 和 Token 认证:

python 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

3. 生成 Token 表

运行 Django 迁移命令,创建 Token 认证所需的数据表:

sh 复制代码
python manage.py migrate

4. 创建 API 视图

创建用户登录接口,生成并返回 Token。

python 复制代码
from django.contrib.auth import authenticate
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status

class LoginView(APIView):
    def post(self, request):
        username = request.data.get("username")
        password = request.data.get("password")
        user = authenticate(username=username, password=password)
        if user:
            token, created = Token.objects.get_or_create(user=user)
            return Response({"token": token.key})
        return Response({"error": "Invalid Credentials"}, status=status.HTTP_401_UNAUTHORIZED)

5. 保护 API 端点

在 API 视图中使用 TokenAuthentication 保护 API,仅允许持有有效 Token 的用户访问:

python 复制代码
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response

class ProtectedView(APIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({"message": "You have access to this protected endpoint."})

6. 测试 API

  1. 获取 Token

    sh 复制代码
    curl -X POST http://127.0.0.1:8000/api/login/ -H "Content-Type: application/json" -d '{"username": "admin", "password": "password"}'

    服务器返回:

    json 复制代码
    {"token": "abc123xyz456"}
  2. 访问受保护的 API

    sh 复制代码
    curl -X GET http://127.0.0.1:8000/api/protected/ -H "Authorization: Token abc123xyz456"

    服务器返回:

    json 复制代码
    {"message": "You have access to this protected endpoint."}

四、自定义 Token 认证方案

如果不使用 DRF 自带的 TokenAuthentication,我们也可以自定义 Token 认证。

1. 自定义 Token 模型

models.py 中创建 Token 存储表:

python 复制代码
from django.db import models
from django.contrib.auth.models import User
import uuid

class CustomToken(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    key = models.CharField(max_length=255, unique=True, default=uuid.uuid4)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.key

2. 创建 Token 生成逻辑

views.py 中定义登录逻辑,生成自定义 Token:

python 复制代码
from django.contrib.auth import authenticate
from django.http import JsonResponse
from .models import CustomToken

def custom_login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username, password=password)

        if user:
            token, created = CustomToken.objects.get_or_create(user=user)
            return JsonResponse({"token": token.key})
        return JsonResponse({"error": "Invalid credentials"}, status=401)

3. 中间件拦截 Token

middleware.py 中定义 Token 验证逻辑:

python 复制代码
from django.http import JsonResponse
from .models import CustomToken

class TokenMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        token = request.headers.get("Authorization")

        if not token:
            return JsonResponse({"error": "Token missing"}, status=401)

        try:
            user_token = CustomToken.objects.get(key=token)
            request.user = user_token.user
        except CustomToken.DoesNotExist:
            return JsonResponse({"error": "Invalid token"}, status=401)

        return self.get_response(request)

然后,在 settings.py 中启用中间件:

python 复制代码
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.authentication.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'myapp.middleware.TokenMiddleware',  # 添加自定义 Token 认证中间件
]

4. 受保护的 API

views.py 中定义需要 Token 认证的接口:

python 复制代码
from django.http import JsonResponse

def protected_view(request):
    return JsonResponse({"message": "Welcome, you are authenticated!"})

5. 测试

  1. 获取 Token

    sh 复制代码
    curl -X POST http://127.0.0.1:8000/custom_login/ -d "username=admin&password=admin"

    返回:

    json 复制代码
    {"token": "abc123xyz456"}
  2. 访问受保护 API

    sh 复制代码
    curl -X GET http://127.0.0.1:8000/protected_view/ -H "Authorization: abc123xyz456"

    返回:

    json 复制代码
    {"message": "Welcome, you are authenticated!"}

五、总结

本方案介绍了 Django 中实现接口 Token 认证的两种方法:

  1. 使用 Django REST framework(DRF)的 Token 认证:适用于 REST API,简单易用。
  2. 自定义 Token 认证:适用于更灵活的需求,可定制 Token 规则、过期策略等。

以上代码和步骤确保了 API 的安全性,避免未经授权的访问,适用于 Django Web 项目的用户身份验证。

相关推荐
流星白龙1 天前
【Redis】2.Redis重大版本
数据库·redis·junit
流星白龙1 天前
【Redis】7.Hash表
数据库·redis·哈希算法
love530love1 天前
OpenClaw Windows Companion 桌面客户端 连接 LM Studio 完整配置指南
人工智能·windows·python·openclaw
流星白龙1 天前
【Redis】4.基本全局命令
数据库·redis·缓存
王八八。1 天前
Navicat 17破解版下载安装教程 附安装激活步骤(2026 最新版)
数据库·navicat
cui_ruicheng1 天前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena157795857921 天前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
_Jimmy_1 天前
FastAPI + SQLAlchemy全局事务管理
python·fastapi
用户8356290780511 天前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python
流星白龙1 天前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存