本教程专注讲解DRF框架自带的核心认证类,通过源码解析和实战演示,帮助开发者快速掌握Session、Token、Basic等内置认证方案的使用方法。
一、内置认证类一览
1.1 核心认证类清单
认证类 | 适用场景 | 凭证传递方式 |
---|---|---|
SessionAuthentication | 网页端会话认证 | Cookie自动携带 |
TokenAuthentication | API客户端长期令牌认证 | Header: Token <key> |
BasicAuthentication | 简单HTTP基础认证 | Header: Basic <base64> |
RemoteUserAuthentication | 代理服务器用户认证 | Header: REMOTE_USER |
1.2 认证类依赖关系
# 所有认证类的基类
class BaseAuthentication:
def authenticate(self, request): # 必须实现
pass
def authenticate_header(self, request): # 用于401响应
pass
二、认证类配置与使用
2.1 全局配置(settings.py
)
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
}
2.2 视图级配置
from rest_framework import authentication, views
class UserDetailView(views.APIView):
authentication_classes = [
authentication.TokenAuthentication
]
def get(self, request):
return Response({'user': request.user.username})
三、核心认证类详解
3.1 Session认证(SessionAuthentication
)
- 适用场景:
Django Admin
整合、前后端不分离项目 - 实现原理:
- 通过Django的
sessionid Cookie
验证用户 - 自动关联到
request.user
和request.session
- 通过Django的
- 安全要求:
- 必须启用
CSRF
中间件 - 仅限HTTPS环境生产使用
- 必须启用
- 代码验证:
# 登录视图(Django原生)
from django.contrib.auth import login
def login_view(request):
user = authenticate(username='admin', password='admin123')
login(request, user) # 设置session
3.2 Token认证(TokenAuthentication
)
-
适用场景:移动端/桌面客户端API访问
-
使用流程:
- 生成Token
python manage.py drf_create_token admin # 命令行生成 # 代码生成(需关联用户) from rest_framework.authtoken.models import Token token = Token.objects.create(user=user)
- 客户端传Token
GET /api/user/ HTTP/1.1 Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
-
数据库模型:
# rest_framework/authtoken/models.py class Token(models.Model): key = models.CharField(max_length=40, primary_key=True) user = models.OneToOneField(User, on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True)
3.3 Basic认证(BasicAuthentication
)
- 适用场景:内部系统快速集成、调试阶段
- *工作原理**:
- 客户端将
username:password
进行Base64
编码 - 通过
Authorization
头传递:Basic <credentials>
- 客户端将
- 示例请求:
GET /api/books/ HTTP/1.1 Authorization: Basic YWRtaW46YWRtaW4xMjM= ```
- 安全警告:
- 必须配合HTTPS使用(明文传输密码)
- 不适合生产环境开放接口
3.4 代理认证(RemoteUserAuthentication
)
- 适用场景:
Nginx/Apache
等代理服务器已处理认证 - 配置示例:
# settings.py AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.RemoteUserBackend', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.RemoteUserAuthentication', ] }
- 请求要求:
- 代理服务器需设置头信息:
- X-Forwarded-User: admin
四、认证流程源码解析
4.1 认证执行入口
# rest_framework/views.py
class APIView:
def initial(self, request, *args, **kwargs):
self.perform_authentication(request) # 认证入口
def perform_authentication(self, request):
request.user # 访问时触发认证
4.2 认证过程分解
# rest_framework/request.py
class Request:
def _authenticate(self):
for authenticator in self.authenticators:
try:
# 调用认证类的authenticate方法
user_auth = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise
if user_auth is not None:
self.user, self.auth = user_auth # 赋值关键属性
return
self._not_authenticated()
4.3 认证结果处理
- 认证成功:填充
request.user
和request.auth
- 认证失败:抛出
AuthenticationFailed
异常 - 跳过认证:返回
None
(继续下一个认证类)
五、多认证方案共存策略
5.1 认证优先级控制
# 先验证Token,失败后尝试Session
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
}
5.2 混合认证示例
class HybridAuthView(APIView):
authentication_classes = [
authentication.TokenAuthentication,
authentication.SessionAuthentication,
]
def get(self, request):
if request.auth: # Token认证结果
return Response({'type': 'token'})
elif request.user.is_authenticated: # Session认证
return Response({'type': 'session'})
六、生产环境注意事项
6.1 安全增强建议
Session
认证:- 设置
SESSION_COOKIE_SECURE
=True
- 配置
CSRF_COOKIE_HTTPONLY
- 设置
Token
认证:- 定期轮换
Token
密钥 - 监控异常
Token
使用
- 定期轮换
Basic
认证:- 仅限内部网络使用
- 限制失败尝试次数
6.2 性能优化
Token
存储:使用Redis
替代数据库# settings.py REST_FRAMEWORK = { 'DEFAULT_AUTH_TOKEN_MODEL': 'redis_tokens.models.RedisToken', }
Session
后端:使用缓存加速
七、调试与问题排查
7.1 常见错误场景
现象 | 原因分析 | 解决方案 |
---|---|---|
401 Unauthorized | 未提供有效凭证 | 检查Authorization头格式 |
403 Forbidden | Session认证未通过CSRF检查 | 添加CSRF Token或禁用CSRF |
Token失效 | 用户被删除或Token被重置 | 重新生成Token |
7.2 调试技巧
# 打印当前认证信息
print(request.authenticators) # 查看生效的认证类
print(request.user) # 认证后的用户对象
print(request.auth) # 附加认证数据(如Token实例)
通过本教程,您已掌握DRF内置认证机制的核心用法,可根据项目需求灵活选择认证方案。下一步可深入学习JWT等第三方认证扩展方案!🚀