Django实现接口Token认证的方法详解
本文详细演示如何在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身份鉴权与后端安全 的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













