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

使用DjangoRESTFramework中的TokenAuthentication()实现PythonAPI身份验证

发布时间:2024-01-01 14:52:31

在Django中使用Django REST Framework的TokenAuthentication()来实现API身份验证非常简单。TokenAuthentication()类是Django REST Framework内置的身份验证类之一,它依赖于认证令牌(token)来鉴别用户。

首先,确保您已经安装了Django和Django REST Framework。可以使用以下命令安装它们:

pip install Django
pip install djangorestframework

接下来,我们需要在Django的设置文件(settings.py)中进行一些配置。将以下行添加到INSTALLED_APPS列表中:

INSTALLED_APPS = [
    ...
    'rest_framework',
]

然后,在settings.py的末尾添加以下行:

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

上述配置中,我们将TokenAuthentication设置为默认的身份验证类,并将IsAuthenticated设置为默认的权限类。这意味着在访问我们的API时,用户必须提供有效的令牌,并且必须经过身份验证才能访问受保护的API视图。

接下来,我们需要为用户生成一个令牌。首先,在models.py中创建一个自定义用户模型(如果您已经有了自定义用户模型,请跳过此步骤)。例如,我们创建了一个名为CustomUser的自定义用户模型:

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

class CustomUser(AbstractUser):
    # 添加额外的字段(如果有)
    pass

然后,运行以下命令创建数据库迁移:

python manage.py makemigrations
python manage.py migrate

接下来,我们需要在用户模型中添加Token。打开models.py文件并将以下内容添加到CustomUser模型类中:

from django.contrib.auth.models import AbstractUser
from django.db import models
from rest_framework.authtoken.models import Token

class CustomUser(AbstractUser):
    # 添加额外字段(如果有)

    def save(self, *args, **kwargs):
        created = False
        if not self.pk:
            created = True
        super().save(*args, **kwargs)
        if created:
            Token.objects.create(user=self)

上述代码中,我们在自定义用户模型的save()方法中创建了一个Token,并将其与用户相关联。

现在,我们已经准备好在视图中使用TokenAuthentication进行身份验证。创建一个名为views.py的文件,并添加以下内容:

from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = {
            'user': str(request.user),
            'auth': str(request.auth),
        }
        return Response(content)

在上面的代码中,我们定义了一个名为ExampleView的API视图。我们指定了TokenAuthentication作为身份验证类,并且设置了IsAuthenticated为权限类。这意味着只有经过身份验证的用户才能访问此视图。

在视图中,我们通过request.user获取当前用户对象,并使用request.auth获取用户的Token。

最后,我们需要定义一个URL模式来映射到我们的视图。打开urls.py文件并添加以下内容:

from django.urls import path
from .views import ExampleView

urlpatterns = [
    path('example/', ExampleView.as_view(), name='example'),
]

在上面的代码中,我们将ExampleView视图映射到/example/ URL上。

这就是全部了!现在,当用户访问/example/ URL时,他们需要在请求的Authorization标头中提供有效的令牌。如果令牌无效或缺失,用户将收到401错误响应。

希望这个例子能帮助您理解如何使用Django REST Framework中的TokenAuthentication进行API身份验证。