欢迎访问宙启技术站
智能推送

使用TokenAuthentication()在Python中实现多用户API访问控制

发布时间:2024-01-01 14:53:15

在Python中,实现多用户API访问控制最常见的方法之一是使用Token认证。TokenAuthentication是Django REST Framework(DRF)的一个认证类,它基于一种令牌机制来验证用户的授权。

以下是一个使用TokenAuthentication实现多用户API访问控制的例子:

首先,确保已安装并设置好Django和Django REST Framework。可以使用以下命令安装它们:

pip install django djangorestframework

接下来,创建一个Django项目和应用程序:

django-admin startproject myapi
cd myapi
python manage.py startapp myapp

在myapi/settings.py中添加myapp到INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'myapp',
    ...
]

然后,在myapi/settings.py中设置REST_FRAMEWORK的默认认证类为TokenAuthentication:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

然后,创建一个User模型并执行数据库迁移:

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

python manage.py makemigrations
python manage.py migrate

接下来,创建一个Token模型用于存储用户的令牌信息:

from django.db import models
from django.contrib.auth.models import User

class Token(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    token = models.CharField(max_length=255)

    def __str__(self):
        return self.token

然后,在myapp/views.py中创建一个用于生成和返回用户令牌的视图函数:

from rest_framework import views
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.authtoken.models import Token

class ObtainTokenView(views.APIView):
    permission_classes = (AllowAny,)

    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(username=username, password=password)
        if user is None:
            return Response({'error': 'Invalid username/password'}, status=400)
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})

最后,在myapi/urls.py中配置URL路由:

from django.urls import path
from myapp.views import ObtainTokenView

urlpatterns = [
    path('api/token/', ObtainTokenView.as_view(), name='obtain_token'),
]

现在,你可以启动服务器并使用以下命令测试API:

首先,创建一个新的用户:

python manage.py createsuperuser

然后,执行以下命令获取令牌:

curl -X POST -H "Content-Type: application/json" -d '{"username": "<username>", "password": "<password>"}' http://localhost:8000/api/token/

<username><password>替换为你创建的用户的凭据。

成功执行后,将返回一个令牌。现在,你可以在API请求中使用该令牌来进行身份验证:

curl -H "Authorization: Token <token>" http://localhost:8000/api/protected/

<token>替换为你收到的令牌。

注意:该示例只处理身份验证,但是在你的应用程序中,你应该添加必要的权限和访问控制来限制特定用户或用户组的访问。