rest framework之认证基本流程源码分析
今日内容:
1、认证
a. 问题:有些API需要用户登录成功之后,才能访问:有些无需登录就能访问。
b.基本使用认证组件
解决:
a.创建两张表:一张用户表,一张存用户登录成功的的token的表
b.用户登录(返回到token并将token保存到数据库)
c.认证流程原理如下:如下图所示:





否则抛出异常,页面显示错误信息。


源码的一些解释:



认证支持三种返回值:1、返回元祖,则request.user、request.auth被赋值,用自己的token和auth。
2、返回None,进入下一个自定义类的循环,但是都返回None时,默认赋值AnonymousUser(匿名用户,表示没登录)。
3、抛出异常,表示认证失败。
# 用户认证 class Authtication(object): def authenticate(self, request): token = request._request.GET.get('token') token_obj = models.UserToken.objects.filter(token=token).first() if not token_obj: # token没给或者数据库查询不到,token提供错了 raise exceptions.AuthenticationFailed('用户认证失败') # 触发异常,AuthenticationFailed内部捕捉到这个错误 # 在rest framework内部会整个两个字段赋值给request,以供后续操作使用 return (token_obj.user, token_obj) # 返回两个元组 def authenticate_header(self, request): pass class OrderView(APIView): ###订单相关业务### authentication_classes = [Authtication, ] # 在类里应用上认证规则token # 先认证后才能查看订单的所有信息 def get(self, request, *args, **kwargs): # request.user # request.auth # 验证是否登入成功,直接看返回的token,如果没有带token说明以前没有登入过 # token = request._request.Get.get('token') # if not token: # return HttpResponse('用户未登入') # self.dispatch() ret = {'code': 1000, 'msg': None, 'data': None} try: ret['data'] = ORDER_DICT except Exception as e: pass return JsonResponse(ret) class UserInfoView(APIView): authentication_classes = [Authtication, ] # 在类里应用上认证规则token,即应用类 # 认证后才能查看用户信息 def get(self, request, *args, **kwargs): return HttpResponse('用户信息') #一般也要返回Jason数据,这里只是简便化的写法
认证可以加多个,但是一般不加多个。下面示例强行加多个认证:
# 用户认证 class FirstAuthtication(object): def authenticate(self, request): pass # 返回None,交给下一个类处理,这里没有给request.user、request.auth def authenticate_header(self, request): pass class Authtication(object): def authenticate(self, request): token = request._request.GET.get('token') token_obj = models.UserToken.objects.filter(token=token).first() if not token_obj: # token没给或者数据库查询不到,token提供错了 raise exceptions.AuthenticationFailed('用户认证失败') # 触发异常,AuthenticationFailed内部捕捉到这个错误 # 在rest framework内部会整个两个字段赋值给request,以供后续操作使用 return (token_obj.user, token_obj) # 返回两个元组 def authenticate_header(self, request): pass class OrderView(APIView): ###订单相关业务### authentication_classes = [FirstAuthtication, Authtication] # 在类里应用上认证规则token # 先认证后才能查看订单的所有信息 def get(self, request, *args, **kwargs): # request.user # request.auth # 验证是否登入成功,直接看返回的token,如果没有带token说明以前没有登入过 # token = request._request.Get.get('token') # if not token: # return HttpResponse('用户未登入') # self.dispatch() ret = {'code': 1000, 'msg': None, 'data': None} try: ret['data'] = ORDER_DICT except Exception as e: pass return JsonResponse(ret) class UserInfoView(APIView): authentication_classes = [Authtication, ] # 在类里应用上认证规则token,即应用类 # 认证后才能查看用户信息 def get(self, request, *args, **kwargs): return HttpResponse('用户信息')
浙公网安备 33010602011771号