drf JWT认证模块与自定制 (2)

   要在全局使用JWT认证,方式如下,它将作用于所有视图:

REST_FRAMEWORK = { # 认证模块 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), 'DEFAULT_PERMISSION_CLASSES':{ 'rest_framework.permissions.IsAuthenticated', } }

   如果你想取消某一个视图的认证功能,则添加空列表即可:

authentication_classes = [] permission_classes = []

   局部使用参见JWT认证中的书写。

JWT认证通过返回信息定制

   在上面的示例中,我们可以看见在用户登录之后,返回信息只有一个JWT字符串,那么我们可不可以将已登录的用户名字返回呢?也是可以的。

   jwt_response_payload_handler()这个函数就是控制返回格式的,我们可以覆写它然后在settings.py中进行配置。

   如下所示:

def jwt_response_payload_handler(token, user=None, request=None): return { 'status': 0, 'msg': 'ok', 'data': { 'token': token, 'user': UserModelSerializers(user).data } }

   在settings.py中进行配置,该项配置是配置在REST_FRAMEWORK中,而不是JWT_AUTH中,一定要注意:

REST_FRAMEWORK = { # 配置自定义登录成功后的返回信息 'JWT_RESPONSE_PAYLOAD_HANDLER':"utils.jwt_response_payload_handler", }

   最后登录完成的结果如下:

{ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozLCJ1c2VybmFtZSI6Inl1bnlhIiwiZXhwIjoxNjA0NTY0Njk3LCJlbWFpbCI6IjIzMjNAcXEuY29tIn0.cvmM6LvoVkSQETybss3fVVGZNXT099o8U21tzDvdFe4", "username": "yunya" } JWT认证流程源码阅读

   又开始愉快的读源码环节了,那么JWT的源码还是比较简单的,下面一起看一看。

签发流程

   首先,我们来分析一下为什么只写了下面一个登录接口,甚至都没写视图,就可以完成签发。

from rest_framework_jwt.views import obtain_jwt_token # 导入视图,它都写好了的,并且会做验证 from rest_framework_jwt.views import ObtainJSONWebToken # 上面是一个变量,内部实际上是 obtain_jwt_token=ObtainJSONWebToken.as_view() urlpatterns = [ path('login/', obtain_jwt_token), ]

   先看obtain_jwt_token,可以发现这个代码:

obtain_jwt_token = ObtainJSONWebToken.as_view()

   我们发现了一个ObtainJSONWebToken这个类,它会执行as_view()方法,先不管,看看它继承了谁:

  

   它继承了JSONWebTokenAPIView,并且该类又继承了APIView,那么这个APIView的视图的源码已经阅读过不下五次了,可以查看之前的文章。我们直接来看关于登录的认证,JSONWebTOkenAPIView中实现了一个post方法:

def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) # 可以发现它有一个自带的序列化器 if serializer.is_valid(): # 直接进行验证 user = serializer.object.get('user') or request.user token = serializer.object.get('token') response_data = jwt_response_payload_handler(token, user, request) response = Response(response_data) if api_settings.JWT_AUTH_COOKIE: expiration = (datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA) response.set_cookie(api_settings.JWT_AUTH_COOKIE, token, expires=expiration, httponly=True) return response return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

   现在看到序列化器对吧,序列化器其实在这里:

class ObtainJSONWebToken(JSONWebTokenAPIView): serializer_class = JSONWebTokenSerializer

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyyp.html