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

打印 上一主题 下一主题

主题 972|帖子 972|积分 2916



  
一、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 安装:
  1. pip install djangorestframework
  2. pip install djangorestframework.authtoken
复制代码

2. 添加到 Django 配置

在 settings.py 中启用 Django REST framework 和 Token 认证:
  1. INSTALLED_APPS = [
  2.     'django.contrib.admin',
  3.     'django.contrib.auth',
  4.     'django.contrib.contenttypes',
  5.     'django.contrib.sessions',
  6.     'django.contrib.messages',
  7.     'django.contrib.staticfiles',
  8.     'rest_framework',
  9.     'rest_framework.authtoken',
  10. ]
  11. REST_FRAMEWORK = {
  12.     'DEFAULT_AUTHENTICATION_CLASSES': (
  13.         'rest_framework.authentication.TokenAuthentication',
  14.     ),
  15.     'DEFAULT_PERMISSION_CLASSES': (
  16.         'rest_framework.permissions.IsAuthenticated',
  17.     ),
  18. }
复制代码
3. 天生 Token 表

运行 Django 迁移下令,创建 Token 认证所需的数据表:
  1. python manage.py migrate
复制代码
4. 创建 API 视图

创建用户登录接口,天生并返回 Token。
  1. from django.contrib.auth import authenticate
  2. from rest_framework.authtoken.models import Token
  3. from rest_framework.response import Response
  4. from rest_framework.views import APIView
  5. from rest_framework import status
  6. class LoginView(APIView):
  7.     def post(self, request):
  8.         username = request.data.get("username")
  9.         password = request.data.get("password")
  10.         user = authenticate(username=username, password=password)
  11.         if user:
  12.             token, created = Token.objects.get_or_create(user=user)
  13.             return Response({"token": token.key})
  14.         return Response({"error": "Invalid Credentials"}, status=status.HTTP_401_UNAUTHORIZED)
复制代码
5. 保护 API 端点

在 API 视图中使用 TokenAuthentication 保护 API,仅允许持有有用 Token 的用户访问:
  1. from rest_framework.authentication import TokenAuthentication
  2. from rest_framework.permissions import IsAuthenticated
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5. class ProtectedView(APIView):
  6.     authentication_classes = [TokenAuthentication]
  7.     permission_classes = [IsAuthenticated]
  8.     def get(self, request):
  9.         return Response({"message": "You have access to this protected endpoint."}
  10. )
复制代码
6. 测试 API


  • 获取 Token
    1. curl -X POST http://127.0.0.1:8000/api/login/ -H "Content-Type: application/json" -d '{"username": "admin", "password": "password"}'
    复制代码
    服务器返回:
    1. {"token": "abc123xyz456"}
    复制代码
  • 访问受保护的 API
    1. curl -X GET http://127.0.0.1:8000/api/protected/ -H "Authorization: Token abc123xyz456"
    复制代码
    服务器返回:
    1. {"message": "You have access to this protected endpoint."}
    复制代码


四、自界说 Token 认证方案

如果不使用 DRF 自带的 TokenAuthentication,我们也可以自界说 Token 认证。
1. 自界说 Token 模型

在 models.py 中创建 Token 存储表:
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. import uuid
  4. class CustomToken(models.Model):
  5.     user = models.OneToOneField(User, on_delete=models.CASCADE)
  6.     key = models.CharField(max_length=255, unique=True, default=uuid.uuid4)
  7.     created_at = models.DateTimeField(auto_now_add=True)
  8.     def __str__(self):
  9.         return self.key
复制代码
2. 创建 Token 天生逻辑

在 views.py 中界说登录逻辑,天生自界说 Token:
  1. from django.contrib.auth import authenticate
  2. from django.http import JsonResponse
  3. from .models import CustomToken
  4. def custom_login(request):
  5.     if request.method == "POST":
  6.         username = request.POST.get("username")
  7.         password = request.POST.get("password")
  8.         user = authenticate(username=username, password=password)
  9.         if user:
  10.             token, created = CustomToken.objects.get_or_create(user=user)
  11.             return JsonResponse({"token": token.key})
  12.         return JsonResponse({"error": "Invalid credentials"}, status=401)
复制代码
3. 中间件拦截 Token

在 middleware.py 中界说 Token 验证逻辑:
  1. from django.http import JsonResponse
  2. from .models import CustomToken
  3. class TokenMiddleware:
  4.     def __init__(self, get_response):
  5.         self.get_response = get_response
  6.     def __call__(self, request):
  7.         token = request.headers.get("Authorization")
  8.         if not token:
  9.             return JsonResponse({"error": "Token missing"}, status=401)
  10.         try:
  11.             user_token = CustomToken.objects.get(key=token)
  12.             request.user = user_token.user
  13.         except CustomToken.DoesNotExist:
  14.             return JsonResponse({"error": "Invalid token"}, status=401)
  15.         return self.get_response(request)
复制代码
然后,在 settings.py 中启用中间件:
  1. MIDDLEWARE = [
  2.     'django.middleware.security.SecurityMiddleware',
  3.     'django.contrib.sessions.middleware.SessionMiddleware',
  4.     'django.middleware.common.CommonMiddleware',
  5.     'django.middleware.csrf.CsrfViewMiddleware',
  6.     'django.middleware.authentication.AuthenticationMiddleware',
  7.     'django.contrib.messages.middleware.MessageMiddleware',
  8.     'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9.     'myapp.middleware.TokenMiddleware',  # 添加自定义 Token 认证中间件
  10. ]
复制代码
4. 受保护的 API

在 views.py 中界说需要 Token 认证的接口:
  1. from django.http import JsonResponse
  2. def protected_view(request):
  3.     return JsonResponse({"message": "Welcome, you are authenticated!"}
  4. )
复制代码
5. 测试


  • 获取 Token
    1. curl -X POST http://127.0.0.1:8000/custom_login/ -d "username=admin&password=admin"
    复制代码
    返回:
    1. {"token": "abc123xyz456"}
    复制代码
  • 访问受保护 API
    1. curl -X GET http://127.0.0.1:8000/protected_view/ -H "Authorization: abc123xyz456"
    复制代码
    返回:
    1. {"message": "Welcome, you are authenticated!"}
    复制代码

五、总结

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

  • 使用 Django REST framework(DRF)的 Token 认证:适用于 REST API,简单易用。
  • 自界说 Token 认证:适用于更机动的需求,可定制 Token 规则、过期策略等。
以上代码和步调确保了 API 的安全性,避免未经授权的访问,适用于 Django Web 项目的用户身份验证。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表