django rest_framework Authentication
# 简介
本文介绍的是 django rest_framework的认证方式.
Token、Session、RemoteUser、jwt等认证方式。前三种是框架自带的,而jwt需要安装第三方库djangorestframework-jwt
,然后使用。
# 源码解析
以下是认证源码认证流程.
通过路由匹配后首先进入到
ApiView.as_view
中.ApiView
继承Django的View
,然后调用View.as_view
在
View
中调用dispatch
方法,因为ApiView
实现dispatch
方法,所以调用的是ApiView.dispatch
而不是View.dispatch
.在
ApiView.dispatch
中将django.request
再次封装成框架的rest_framework.request
封装的过程中将配置的Authentication类注入到request中.
封装完request后,调用
ApiView.perform_authentication
开始认证认证的过程是通过
request.user
,然后再调用request._authentication
进行循环遍历所有注入的Authentiation
类中authenticate
方法进行认证,认证成功则返回user
和auth
两个结果.
# 认证方式
可以自定义认证类,只需要继承BaseAuthentication
类,然后实现authenticate
方法即可,然后将该类注入到request
即可.
或者使用框架自带的认证类也可。
# Token
是框架自带的认证方式之一.
# 使用
- 配置authtoken app settings
INSTALLED_APPS = [
...
'rest_framework.authtoken']
2
3
然后使用python manage.py migrate
,会创建authtoken表,该表连接auth_user.表,每个用户都有对应一个token,用户每次访问带有该token,系统就能通过token得到当前user.
- 局部添加认证方式.
在TestView
添加TokenAuthentication
认证, 路由到TestView时,会调用该类中的authenticate
方法,通过token获取到user.
view.py
from rest_framework.authentication import TokenAuthentication
class TestView(APIView):
authentication_classes = (TokenAuthentication,)
def get(self, *args, **kwargs):
return HttpResponse(self.request.user)
2
3
4
5
6
7
8
- 全局添加认证方式
任何路由请求需要通过Token认证.
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
2
3
4
5
# 缺陷
- Token验证是放在一张表中,即authtoken_token中,key没有失效时间,永久有效,一旦泄露,后果不可想象,安全性极差。
- 不利于分布式部署或多个系统使用一套验证,authtoken_token是放在某台服务器上的,如果分布式部署,将失效,或多个系统用一套验证,将必须复制该表到相应服务器上,麻烦费力。
鉴于以上缺陷,使用jwt更加优秀.
# session
drf中session认证,是通过django SessionMiddleware
和AuthenticationMiddleware
中将user存储到request中,然后获取到的.