一、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 认证所需的数据表:
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 项目的用户身份验证。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |