Django实现接口Token认证的方法详解

Dylan
Dylan
发布时间:2026-10-11 | 3人浏览过
原创

本文详细演示如何在Django项目中实现接口Token认证。通过内置DRF组件与自定义模型中间件两条路径,逐步完成配置生成、视图保护与安全校验流程,帮助开发者快速建立API身份验证机制并避开常见配置陷阱。

Django接口Token认证的核心思路

接口安全依赖严格的身份核验机制。Token认证的通用流程分为四段:服务端校验账号后签发唯一凭证;客户端将凭证注入HTTP请求头;网关或视图层拦截并解析该头部;比对成功后放行,失败则立即终止并返回未授权状态。根据项目成熟度,可选择依赖官方封装的DRF模块,或自行控制底层模型与中间件。

环境准备

  • 已安装的Python运行环境与Django框架
  • 基础的项目目录结构(含settings.py与urls.py)
  • 终端或命令行工具用于执行迁移与接口测试

方案一:基于DRF内置机制的实现

第1步:安装依赖包

目的:引入官方提供的REST框架及Token组件。
入口:项目根目录终端。
动作:执行安装命令。
重要参数:移除旧版独立安装包名,直接使用主包即可。
完成状态:终端显示Successfully installed相关包名。

pip install djangorestframework

第2步:修改全局配置

目的:注册应用并设置默认认证类为Token模式。
入口:settings.py文件。
动作:写入应用列表与REST框架规则。
重要参数:DEFAULT_AUTHENTICATION_CLASSES必须包含Token认证类,DEFAULT_PERMISSION_CLASSES控制默认访问级别。
完成状态:settings.py保存后全局生效。

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认证所需的数据表。
入口:项目根目录终端。
动作:运行迁移命令。
重要参数:无额外参数,系统自动扫描所有注册应用的变更。
完成状态:控制台输出创建rest_framework_authtoken_token表及相关索引信息。

python manage.py migrate

第4步:编写登录与受保护视图

目的:提供凭证校验接口并限制敏感路由访问权限。
入口:views.py与urls.py。
动作:继承APIView创建Post登录逻辑与Get受保护逻辑。
重要参数:authenticate()负责本地哈希比对,Token.objects.get_or_create()防止重复生成。
完成状态:客户端提交正确账号密码后返回JSON格式的Token字符串;未携带或错误Header则触发401响应。

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)


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

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

第5步:接口联调测试

目的:验证签发链路放行逻辑是否正常。
入口:curl或Postman等HTTP客户端。
动作:依次发起Post登录请求与携带头部的Get请求。
重要参数:DRF默认要求请求头格式为Authorization: Token {key}。
可观察的完成状态:获取Token后,在请求头追加指定格式字符串即可成功读取受保护端点数据。

curl -X POST http://127.0.0.1:8000/api/login/ -H "Content-Type: application/json" -d '{"username": "admin", "password": "your_password"}'
curl -X GET http://127.0.0.1:8000/api/protected/ -H "Authorization: Token 你的token值"

方案二:自定义Token模型与中间件

第6步:搭建Token存储模型

目的:提供独立于官方的凭证持久化结构。
入口:models.py文件。
动作:定义OneToOne关联与随机字符主键。
重要参数:default=uuid.uuid4保证键值全局唯一。
完成状态:模型字段包含外键关联、唯一字符串键值及自动时间戳。

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

第7步:开发登录生成逻辑

目的:复用现有用户体系并在首次登录时绑定新Key。
入口:views.py文件。
动作:接收表单POST数据并调用认证函数。
重要参数:JsonResponse适用于前后端分离场景下的原生Django视图。
完成状态:验证通过后向客户端推送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)

第8步:编写鉴权中间件

目的:在请求到达业务视图前统一剥离并校验Token合法性。
入口:middleware.py文件。
动作:拦截Request对象提取Header并查询数据库。
重要参数:捕获DoesNotExist异常用于精准返回401。
完成状态:非法或空请求被提前拦截,合法请求将user对象挂载至request.user。

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)

第9步:注册中间件并验证流转

目的:使自定义逻辑介入整个WSGI请求周期。
入口:settings.py中的MIDDLEWARE列表。
动作:追加相对路径配置项并调整顺序。
重要参数:建议置于CSRF之后以保证会话上下文完整。
完成状态:未携带正确Key的请求被拦截返回401,合法请求正常进入视图函数。

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',
]

自定义方案的测试命令需注意头部格式差异:

curl -X POST http://127.0.0.1:8000/custom_login/ -d "username=admin&password=your_password"
curl -X GET http://127.0.0.1:8000/protected_view/ -H "Authorization: 你的token值"

常见问题排查

若DRF登录接口始终返回401且未命中业务逻辑,请检查settings.py中的INSTALLED_APPS是否遗漏'rest_framework.authtoken',或确认CORS跨域插件是否拦截了非简单请求的预检OPTIONS方法。针对自定义中间件,若日志提示Key未找到,请核对前端传递的Authorization字段是否带有多余空格,或尝试打印原始Header值确认传输格式是否一致。此外,生产环境中强烈建议配合HTTPS加密通道传输Token,避免窃听风险。

简要总结

上述两种路径覆盖了从开箱即用到高度定制的鉴权需求。内置DRF方案适合快速迭代的标准REST接口,配置集中且维护成本低;自定义模型加中间件的方案则提供更强的粒度控制权,便于后续扩展刷新令牌、黑名单拦截或分级权限策略。合理组合这些代码块与配置项,即可有效阻断未授权请求,夯实Django Web项目的后端安全基线。以上就是 Django接口Token认证实现指南 的详细内容,更多关于 API身份鉴权与后端安全 的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表