创建的token如何交给前端进行使用呢?   

  在官方文档说明中,将产生的這个token放在header中

TokenAutication认证原理   

  用户认证成功以后,会在服务端产生一个Token。并且服务端会将這个Token设置在header里面返回给用户。下次用户在进行登陆相关操作,就根据這个Token去Token表查找相应的用户,并把用户名根据Token提取出来。

  我们可以在后端通过request.auth获取用户传递过来的token

  那么如何通过Token取出用户的呢?先来看看源码:

  1. class TokenAuthentication(BaseAuthentication):
  2. keyword = 'Token'
  3. model = None
  4.  
  5. def get_model(self):
  6. if self.model is not None:
  7. return self.model
  8. from rest_framework.authtoken.models import Token
  9. return Token
  10.  
  11. def authenticate(self, request):
  12. auth = get_authorization_header(request).split() # 调用get_authorization_header
  13. # auth = ["Token" ,"c4840b5226a65806c586c239345fce66caf12409"]
  14. if not auth or auth[0].lower() != self.keyword.lower().encode():
  15. return None
  16.  
  17. if len(auth) == 1:
  18. msg = _('Invalid token header. No credentials provided.')
  19. raise exceptions.AuthenticationFailed(msg)
  20. elif len(auth) > 2:
  21. msg = _('Invalid token header. Token string should not contain spaces.')
  22. raise exceptions.AuthenticationFailed(msg)
  23.  
  24. try:
  25. token = auth[1].decode() # 取出c4840b5226a65806c586c239345fce66caf12409
  26. except UnicodeError:
  27. msg = _('Invalid token header. Token string should not contain invalid characters.')
  28. raise exceptions.AuthenticationFailed(msg)
  29.  
  30. return self.authenticate_credentials(token) # 然后调用authenticate_credentials
  31.  
  32. def authenticate_credentials(self, key):
  33. model = self.get_model() # 返回Token model
  34. try:
  35. token = model.objects.select_related('user').get(key=key) # 然后通过key获取用户
  36. except model.DoesNotExist:
  37. raise exceptions.AuthenticationFailed(_('Invalid token.'))
  38.  
  39. if not token.user.is_active:
  40. raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
  41.  
  42. return (token.user, token) # 返回用户与token

  然后,我们到get_authorization_header()方法里面去看看:

  1. def get_authorization_header(request):
  2. auth = request.META.get('HTTP_AUTHORIZATION', b'') # AUTHORIZATION這个就是之前服务端返回的,只不过Django会默认加上HTTP
  3. if isinstance(auth, text_type):
  4. # Work around django test client oddness
  5. auth = auth.encode(HTTP_HEADER_ENCODING)
  6. return auth # 返回"Token c4840b5226a65806c586c239345fce66caf12409"

  经过上述过程,就完成了Token的获取操作。下面,我们来看看,這个Token是如何创建的:

  当用户进行登陆以后:

  1. url(r'^api-token-auth/', views.obtain_auth_token)

  通过上述接口,进入到试图函数:

  1. class ObtainAuthToken(APIView):
  2. throttle_classes = ()
  3. permission_classes = ()
  4. parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
  5. renderer_classes = (renderers.JSONRenderer,)
  6. serializer_class = AuthTokenSerializer
  7.  
  8. def post(self, request, *args, **kwargs): # 调用這个方法
  9. serializer = self.serializer_class(data=request.data,context={'request': request})
  10. serializer.is_valid(raise_exception=True)
  11. user = serializer.validated_data['user']
  12. token, created = Token.objects.get_or_create(user=user) # 没有就创建
  13. return Response({'token': token.key}) # 将token返回
  14. obtain_auth_token = ObtainAuthToken.as_view()

  从上面的分析来看,当用户没有产生Token,DRF则会给该用户生成一个Token。然后将這个Token返回给前端页面进行保存。

TokenAutication源码分析的更多相关文章

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  8. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  9. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

随机推荐

  1. ASP.NET MVC学习(一)之路由篇Route

    什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...

  2. git 学习小记

    话说 git 出了已经很久了,可是我一直没用过.其实也不是没用过,只不过在 github 上下载东西那根本就不是在用 git,只是单纯的HTTP下载而已.我们公司用的是 svn,所以我只会一点点svn ...

  3. 新.Net架构必备工具列表

    N多年前微软官网曾发了.Net下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了.而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要 ...

  4. HTML5 CSS Reset

    最近在学习HTML和CSS,发现一个不错的模板,放于此处. /* html5doctor.com Reset Stylesheet v1.6.1 Last Updated: 2010-09-17 Au ...

  5. input文本框禁止修改文本——disabled和readonly属性的作用及区别

    1.input文本框禁止修改文本 disabled属性:<input type="text" name="name" value="xxx&qu ...

  6. 从Dying gasp功能看Linux的响应速度(zhuan)

    转自https://blog.csdn.net/qq_20405005/article/details/77967358 前一阵子在做dying gasp功能测试,过程中恰好测试到了Linux的响应速 ...

  7. HTML播放FLASH(SWF)神器-SWFObject

    环境 必须有 swfobject.js和 expressInstall.swf js:  http://pan.baidu.com/share/link?shareid=2536087943& ...

  8. MySQL之EXPLAIN 执行计划详解

    explain 可以分析 select 语句的执行,即 MySQL 的“执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好): | All | index ...

  9. testng运行失败,继续执行

    1.重写断言类 public class Verify { public static StringBuffer verificationErrors= new StringBuffer();; pu ...

  10. springMVC源码分析--视图View(一)

    之前的博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们已经介绍了数据返回值的处理,在博客springMVC源码分析--ViewResolver视图解析器( ...