开发者

Django实现接口token检测的方法详解

开发者 https://www.devze.com 2025-04-10 11:17 出处:网络 作者: 百锦再@新空间代码工作室
目录一、Token认证的实现思路二、环境准备三、基于 Django REST Framework(DRF)的 Token 认证1. 安装 Django REST framework2. 添加到 Django 配置3. 生成 Token 表4. 创建 API 视图5. 保护 API 端点6. 测试 API四
目录
  • 一、Token认证的实现思路
  • 二、环境准备
  • 三、基于 Django REST Framework(DRF)的 Token 认证
    • 1. 安装 Django REST framework
    • 2. 添加到 Django 配置
    • 3. 生成 Token 表
    • 4. 创建 API 视图
    • 5. 保护 API 端点
    • 6. 测试 API
  • 四、自定义 Token 认证方案
    • 1. 自定义 Token 模型
    • 2. 创建 Token 生成逻辑
    • 3. 中间件拦截 Token
    • 4. 受保护的 API
    • 5. 测试
  • 五、总结

    一、Token认证的实现思路

    用户登录后生成Token:用户登录成功后,服务器生成一个Token,并返回给客户端。

    客户端请求时携带Token:客户端在每次请求时,将Token放入HTTP请求头(Headers)中。

    服务器端验证Token:Django后端解析请求中的Token,并验证其合法性。

    Token校验通过,允许访问接口;否则,返回未授权的错误信息。

    二、环境准备

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

    • 基于 Django REST framework(DRF) 的 Token 认证
    • 自定义 Token 认证

    三、编程客栈基于 Django REST Framework(DRF)的 Token 认证

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

    1. 安装 Django REST framework

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

    pip install djangorestframework
    pip install djangorestframework.authtoken
    

    2. 添加到 Django 配置

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

    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 认证所需的数据表:

    python manage.py migrate
    

    4. 创建 API 视图

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

    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 的用户访问:

    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

    获取 Token:

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

    服务器返回:

    {"token": "abc123xyz456"}
    

    访问受保护的 API:

    curl -X GET http://127.0.0.1:8000/api/protected/ -H "Authorization: Token abc123xyz456"
    

    服务器返回:

    {"message": "You have access to this protected endpoint."}

    四、自定义 Token 认证方案

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

    1. 自定义 Token 模型

    在 models.py 中创建 Token 存储表:

    from django.db import models
    fromxkbjpEHsS 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:

    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 验证逻辑:

    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 中启用中间件:

    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 认证的接口:

    from django.http import JsonResponse
    
    def protected_view(request):
        return JsonResponse({"message": "Welcome, you are authenticated!"})
    

    5. 测试

    获取 Token:

    curl -X POST http://127.0.0.1:8000/custom_login/ -d "username=admin&password=admin"
    

    返回:

    {"token": "abc123xyz456"}
    

    访问受保护 API:

    curl -X GET http://127.0.0.1:8000/protected_view/ -H "Authorization: abc123xyz456"
    

    返回:

    {"message": "Welcome, you are authenticated!"}
    

    五、总结

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

    使用 Django REST framework(DRF)的 Token 认证:适用于 REST API,简单易用。

    自定义 Token 认证:适用于更灵活的需求,可定制 Token 规则、过期策略等。

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

    到此这篇关于Django实现接口token检测的方法详解的文章就介绍到这了,更多相关Django接口token检测内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号