本文介绍的是 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
ApiView.perform_authentication
开始认证 request.user
,然后再调用request._authentication
进行循环遍历所有注入的Authentiation
类中authenticate
方法进行认证,认证成功则返回user
和auth
两个结果可以自定义认证类,只需要继承BaseAuthentication
类,然后实现authenticate
方法即可,然后将该类注入到request
即可.
或者使用框架自带的认证类也可。
是框架自带的认证方式之一.
INSTALLED_APPS = [
...
'rest_framework.authtoken']
然后使用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)
任何路由请求需要通过Token认证.
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
鉴于以上缺陷,使用jwt更加优秀.
drf中session认证,是通过django SessionMiddleware
和AuthenticationMiddleware
中将user存储到request中,然后获取到的.