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

使用rest_framework.authtoken.models在Python中实现基于令牌的身份验证和授权

发布时间:2023-12-28 07:25:41

在Python中使用rest_framework.authtoken.models实现基于令牌的身份验证和授权,首先需要安装djangorestframeworkdjango.contrib.auth模块。

步是在Django的项目中创建一个Token模型来存储用户的令牌。可以在项目的任何一个app中的models.py文件中添加以下代码:

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

class Token(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    key = models.CharField(max_length=40, unique=True)

    def __str__(self):
        return self.key

这个模型有两个字段:userkey,其中user是一个外键关联到默认的User模型,key是用于存储生成的令牌字符串。

接下来,需要在Django的settings.py文件中进行以下配置:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    ...
]

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

这个配置将rest_framework.authtoken添加到已安装的app列表中,并将TokenAuthentication设置为默认的身份验证类。

创建好Token模型并进行配置后,需要执行以下命令来迁移数据库:

python manage.py makemigrations
python manage.py migrate

接下来可以通过以下方式来生成用户的令牌:

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

# 创建用户
user = User.objects.create(username='testuser', password='testpassword')

# 生成令牌
token = Token.objects.create(user=user)

# 打印令牌字符串
print(token)

令牌生成后,可以将其分发给用户,用户可以将其用于API请求的身份验证。例如,在Django的视图函数中,可以使用以下方式进行身份验证:

from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

@api_view(['GET'])
@authentication_classes((TokenAuthentication,))
@permission_classes((IsAuthenticated,))
def example_view(request):
    # 访问需要身份验证的视图函数
    content = {'message': 'Hello, World!'}
    return Response(content)

在这个例子中,@authentication_classes((TokenAuthentication,))装饰器将TokenAuthentication添加到视图函数的身份验证类中,@permission_classes((IsAuthenticated,))装饰器将IsAuthenticated添加到视图函数的权限类中。

当用户在请求中提供有效的令牌时,视图函数会返回Hello, World!的响应。如果用户没有提供有效的令牌,视图函数会返回一个401 Unauthorized的响应。

以上就是使用rest_framework.authtoken.models在Python中实现基于令牌的身份验证和授权的例子。