要在全局使用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