如何使用Django信任和安全令牌进行身份验证

2023-04-11 00:00:00 令牌 如何使用 身份验证

Django提供了一种名为“TokenAuthentication”的身份验证方式,使用信任和安全令牌进行验证。下面详细介绍如何使用它来实现身份验证。

1.创建认证令牌

首先,需要为每个用户创建一个认证令牌。可以在用户创建后使用Django的信号量创建令牌。在应用程序的“signals.py”文件中添加以下代码:

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

当一个用户创建时,这个signale将会为该用户创建一个新的Token实例。

2.启用身份验证方式

要使用身份验证方式,需要在Django的REST框架内启用它。在应用程序的“settings.py”文件中添加以下设置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

这将启用TokenAuthentication作为默认身份验证方式,并要求对每个视图都进行身份验证。

3.登录用户

现在可以使用HTTP请求头中的认证令牌来登录用户。要登录,请在使用POST请求时提供用户名和密码,这将在后端进行身份验证并返回令牌。下面是一个视图的例子:

from django.contrib.auth import authenticate, login
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authtoken.models import Token

class LoginView(APIView):
    def post(self, request, format=None):
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            token, created = Token.objects.get_or_create(user=user)
            return Response({'token': token.key})
        else:
            return Response({'error': 'Invalid Credentials'})

这个视图接受POST请求,并尝试使用用户名和密码进行身份验证。如果验证成功,它将为该用户创建一个并返回令牌。

4.在视图中使用身份验证

现在已经启用了身份验证方式,并且已经有了一个令牌,可以在视图中使用身份验证。下面是一个视图的例子:

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

class ExampleView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        return Response({'message': 'Hello World'})

这个视图要求必须登录并验证才能访问。如果用户未登录,则会返回403错误。

5.使用令牌进行HTTP请求

要在HTTP请求的“Authorization”请求头中使用令牌,请使用以下格式:

Authorization: Token {token_value}

其中,{token_value}将被替换为先前创建的令牌值,例如:

Authorization: Token 8e10048fb3ec146812424493007f9ee8c3b00289

在使用REST客户端时,请将此Authorization头包含在发出的请求中。

这是一个例子:

import requests

url = 'http://example.com/api/v1/example/'
headers = {'Authorization': 'Token 8e10048fb3ec146812424493007f9ee8c3b00289'}

r = requests.get(url, headers=headers)

print r.content

在此示例中,它使用先前创建的Token值来验证get请求的API视图。它在请求头中发送了一个Authorization头。(在python3测试输出是bytes)

以上就是利用Django信任和安全令牌进行身份验证的详细介绍和相关代码演示。

相关文章