Django实现接口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 提供了现成的 Token 认证机制,下面是实现步骤。
  • 如果不使用 DRF 自带的 TokenAuthentication,我们也可以自定义 Token 认证。
  • 本方案介绍了 Django 中实现接口 Token 认证的两种方法: 使用 Django REST framework(DRF)的 Token 认证:适用于 REST API,简单易用。 自定义 Token 认证:适用于更灵活的需求,可定制 Token 规则、过期策略等。 以上代码和步骤确保了 API 的安全性,避免未经授权的访问,适用于 Django Web 项目的用户身份验证。 到此这篇关于Django实现接口token检测的完整实现方案的文章就介绍到这了,更多相关Django接口token检测内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Django token 生成与验证的实现 Django实现接口token检测的方法详解 Vue 和 Django 实现 Token 身份验证的流程 Django基于Token的验证使用的实现 django基于存储在前端的token用户认证解析 Django JWT Token RestfulAPI用户认证详解
  • 目录
    • 一、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放入HTTP请求头(Headers)中。
      • 服务器端验证Token:Django后端解析请求中的Token,并验证其合法性。
      • Token校验通过,允许访问接口;否则,返回未授权的错误信息。

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

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

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

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

      pip install djangorestframework
      pip install djangorestframework.authtoken
      

      在 settings.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',
          ),
      }
      
      

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

      python manage.py migrate
      

      创建用户登录接口,生成并返回 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)
      
      

      在 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."})
      

      获取 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."}
      

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

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

      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
      

      在 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)

      在 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 认证中间件
      ]
      

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

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

      获取 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检测内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

      您可能感兴趣的文章:

      • Django token 生成与验证的实现
      • Django实现接口token检测的方法详解
      • Vue 和 Django 实现 Token 身份验证的流程
      • Django基于Token的验证使用的实现
      • django基于存储在前端的token用户认证解析
      • Django JWT Token RestfulAPI用户认证详解

      站内搜索