当前位置: 代码网 > it编程>前端脚本>Python > Django实现接口token检测的完整实现方案

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

2025年12月13日 Python 我要评论
一、token认证的实现思路用户登录后生成token:用户登录成功后,服务器生成一个token,并返回给客户端。客户端请求时携带token:客户端在每次请求时,将token放入http请求头(head

一、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 配置

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

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 认证方案

如果不使用 drf 自带的 tokenauthentication,我们也可以自定义 token 认证。

1. 自定义 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

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检测内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com