我来详细讲解一下“Django Rest Framework实现身份认证源码详解”的完整攻略,下面我们将分为以下几个部分:
- 介绍Django Rest Framework身份认证的基本原理
- 详细讲解Django Rest Framework中使用基于Token的身份认证
- 详细讲解Django Rest Framework中使用基于Session的身份认证
1. Django Rest Framework身份认证的基本原理
在Django Rest Framework中实现身份认证,需要在视图函数中添加认证类,Django Rest Framework中提供基于Token和基于Session两种方式来实现身份认证。
在views.py中添加身份认证类的方法如下:
from rest_framework.authentication import TokenAuthentication
class ExampleView(APIView):
authentication_classes = [TokenAuthentication]
# your code here
上述代码中,我们导入了TokenAuthentication
类,然后将ExampleView
视图函数中的authentication_classes
属性设置为[TokenAuthentication]
即可使用基于Token的身份认证。
如果要使用基于Session的身份认证,只需将authentication_classes
属性设置为[SessionAuthentication]
即可。
2. Django Rest Framework中使用基于Token的身份认证
Django Rest Framework中的Token身份认证是一种轻量级的身份认证方式,它的原理是:当用户首次登录,服务端会生成一个Token并返回给客户端,这个Token作为客户端请求时的身份凭证,服务端根据这个Token来识别用户的身份。
下面我们来看一下如何在Django Rest Framework中使用基于Token的身份验证。
2.1 生成Token
在Django Rest Framework中生成Token有两种方式:使用rest_framework.authtoken库和使用Django自带的TokenAuthentication库。这里我们采用使用Django自带的TokenAuthentication库的方式来生成Token。
在使用基于Token的身份认证前,我们需要先给用户生成一个Token,生成Token的方法如下:
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
user = User.objects.get(username='username')
token = Token.objects.create(user=user)
在上面的代码中,我们首先通过User.objects.get()
方法获取到某个用户,然后使用Token.objects.create()
方法为该用户生成一个Token。生成的Token将保存在数据库中的authtoken_token
表中,每个Token对应一条记录,记录中保存了Token的值和对应的用户。
2.2 配置Token认证
我们已经生成了Token,接下来,我们需要在Django Rest Framework中配置Token认证。
from rest_framework.authentication import TokenAuthentication
class ExampleView(APIView):
authentication_classes = [TokenAuthentication]
def get(self, request, *args, **kwargs):
# your code here
pass
在上面的代码中,我们导入TokenAuthentication
类,并将认证方式设置为基于Token的认证,然后在视图函数ExampleView
的get
方法中就可以通过request.user
来获取当前已经认证的用户。
此时,我们就可以在客户端中将Token值放入请求头中进行请求:
headers = {'Authorization': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)
在上面的代码中,我们在请求头中添加了Authorization
字段,并将Token值放入其中。在服务端中,Django Rest Framework会自动解析请求头中的Token并进行身份认证。
2.3 自定义Token模型
Django Rest Framework中提供的Token模型较为简单,如果我们需要在Token模型中添加一些自定义的字段,需要自定义Token模型。
自定义Token模型的方法如下:
- 首先,在models.py中创建一个自定义的Token模型,在Token模型中添加一些自定义的字段。
from django.contrib.auth.models import AbstractUser, User
from django.db import models
from rest_framework.authtoken.models import Token
class CustomToken(Token):
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户', related_name='auth_tokens')
created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
ordering = ['-created_time']
verbose_name = '自定义Token'
verbose_name_plural = '自定义Token'
在上面的代码中,我们从rest_framework.authtoken.models import Token
中导入原生的Token类,并自定义了一个CustomToken模型,在CustomToken模型中添加了一个created_time
字段,并将user
字段设置为外键。
- 然后,我们需要修改Django Rest Framework中的Token认证类,将它的token_model属性设置为我们自定义的Token模型。修改认证类的方法如下:
from rest_framework.authentication import TokenAuthentication
from myapp.models import CustomToken
class CustomTokenAuthentication(TokenAuthentication):
model = CustomToken
在上面的代码中,我们定义了一个自定义的Token认证类,将model属性设置为我们自定义的Token模型。
- 最后,在视图函数中使用我们自定义的Token认证类即可。
class ExampleView(APIView):
authentication_classes = [CustomTokenAuthentication]
def get(self, request, *args, **kwargs):
# your code here
pass
在上面的代码中,我们将ExampleView
视图函数中的身份认证方式设置为基于自定义Token的认证方式。
3. Django Rest Framework中使用基于Session的身份认证
Django Rest Framework中的Session身份认证是一种通过使用浏览器的Cookie来实现的身份认证方式。
下面我们来看一下如何在Django Rest Framework中使用基于Session的身份认证。
3.1 配置Session认证
在Django Rest Framework中使用Session身份认证的方式与使用Token身份认证稍有不同,我们需要先在Django中开启Session,并在Django Rest Framework中进行相关配置。
- 首先,需要在Django中配置Session,可以在settings.py中进行配置,代码如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # session存储方式
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 浏览器关闭时session是否过期
SESSION_COOKIE_HTTPONLY = True # session cookie只能通过HTTP请求来获取,JS无法获取
SESSION_COOKIE_SECURE = False # 是否启用HTTPS安全传输协议
在上面代码中,我们使用Django自带的Session存储方式,设置Session在浏览器关闭时不过期,设置Session cookie只能通过HTTP请求来获取,设置Session cookie不启用HTTPS安全传输协议。
- 然后,在视图函数中添加Session认证:
from rest_framework.authentication import SessionAuthentication
class ExampleView(APIView):
authentication_classes = [SessionAuthentication]
def get(self, request, *args, **kwargs):
# your code here
pass
在上面的代码中,我们导入了Django Rest Framework中的SessionAuthentication认证类,并将ExampleView
视图函数中的身份认证方式设置为基于Session的认证方式。
3.2 在客户端中使用Session认证
在客户端中使用Session认证的方式与使用Token认证略微不同,需要使用Django自带的django.contrib.sessions.backends.base.SessionBase
类来模拟Session认证。
import requests
from django.contrib.sessions.backends.base import SessionBase
session = SessionBase()
session['_auth_user_id'] = '1' # 用户ID
session['_auth_user_backend'] = 'django.contrib.auth.backends.ModelBackend'
headers = {'Cookie': 'sessionid={}'.format(session.session_key)}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)
在上面的代码中,我们首先导入了django.contrib.sessions.backends.base.SessionBase
类,然后模拟Session认证,将用户ID和用户认证后端保存到Session中,最后在请求头中添加sessionid即可。
这样,我们就可以在客户端中使用Session认证对Django Rest Framework进行身份认证了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Rest Framework实现身份认证源码详解 - Python技术站