如何使用Django信任和安全令牌进行身份验证
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信任和安全令牌进行身份验证的详细介绍和相关代码演示。
相关文章