TokenAutication源码分析
创建的token如何交给前端进行使用呢?
在官方文档说明中,将产生的這个token放在header中
TokenAutication认证原理
用户认证成功以后,会在服务端产生一个Token。并且服务端会将這个Token设置在header里面返回给用户。下次用户在进行登陆相关操作,就根据這个Token去Token表查找相应的用户,并把用户名根据Token提取出来。
我们可以在后端通过request.auth获取用户传递过来的token
那么如何通过Token取出用户的呢?先来看看源码:
- class TokenAuthentication(BaseAuthentication):
- keyword = 'Token'
- model = None
- def get_model(self):
- if self.model is not None:
- return self.model
- from rest_framework.authtoken.models import Token
- return Token
- def authenticate(self, request):
- auth = get_authorization_header(request).split() # 调用get_authorization_header
- # auth = ["Token" ,"c4840b5226a65806c586c239345fce66caf12409"]
- if not auth or auth[0].lower() != self.keyword.lower().encode():
- return None
- if len(auth) == 1:
- msg = _('Invalid token header. No credentials provided.')
- raise exceptions.AuthenticationFailed(msg)
- elif len(auth) > 2:
- msg = _('Invalid token header. Token string should not contain spaces.')
- raise exceptions.AuthenticationFailed(msg)
- try:
- token = auth[1].decode() # 取出c4840b5226a65806c586c239345fce66caf12409
- except UnicodeError:
- msg = _('Invalid token header. Token string should not contain invalid characters.')
- raise exceptions.AuthenticationFailed(msg)
- return self.authenticate_credentials(token) # 然后调用authenticate_credentials
- def authenticate_credentials(self, key):
- model = self.get_model() # 返回Token model
- try:
- token = model.objects.select_related('user').get(key=key) # 然后通过key获取用户
- except model.DoesNotExist:
- raise exceptions.AuthenticationFailed(_('Invalid token.'))
- if not token.user.is_active:
- raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
- return (token.user, token) # 返回用户与token
然后,我们到get_authorization_header()方法里面去看看:
- def get_authorization_header(request):
- auth = request.META.get('HTTP_AUTHORIZATION', b'') # AUTHORIZATION這个就是之前服务端返回的,只不过Django会默认加上HTTP
- if isinstance(auth, text_type):
- # Work around django test client oddness
- auth = auth.encode(HTTP_HEADER_ENCODING)
- return auth # 返回"Token c4840b5226a65806c586c239345fce66caf12409"
经过上述过程,就完成了Token的获取操作。下面,我们来看看,這个Token是如何创建的:
当用户进行登陆以后:
- url(r'^api-token-auth/', views.obtain_auth_token)
通过上述接口,进入到试图函数:
- class ObtainAuthToken(APIView):
- throttle_classes = ()
- permission_classes = ()
- parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
- renderer_classes = (renderers.JSONRenderer,)
- serializer_class = AuthTokenSerializer
- def post(self, request, *args, **kwargs): # 调用這个方法
- serializer = self.serializer_class(data=request.data,context={'request': request})
- serializer.is_valid(raise_exception=True)
- user = serializer.validated_data['user']
- token, created = Token.objects.get_or_create(user=user) # 没有就创建
- return Response({'token': token.key}) # 将token返回
- obtain_auth_token = ObtainAuthToken.as_view()
从上面的分析来看,当用户没有产生Token,DRF则会给该用户生成一个Token。然后将這个Token返回给前端页面进行保存。
TokenAutication源码分析的更多相关文章
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
随机推荐
- ASP.NET MVC学习(一)之路由篇Route
什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...
- git 学习小记
话说 git 出了已经很久了,可是我一直没用过.其实也不是没用过,只不过在 github 上下载东西那根本就不是在用 git,只是单纯的HTTP下载而已.我们公司用的是 svn,所以我只会一点点svn ...
- 新.Net架构必备工具列表
N多年前微软官网曾发了.Net下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了.而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要 ...
- HTML5 CSS Reset
最近在学习HTML和CSS,发现一个不错的模板,放于此处. /* html5doctor.com Reset Stylesheet v1.6.1 Last Updated: 2010-09-17 Au ...
- input文本框禁止修改文本——disabled和readonly属性的作用及区别
1.input文本框禁止修改文本 disabled属性:<input type="text" name="name" value="xxx&qu ...
- 从Dying gasp功能看Linux的响应速度(zhuan)
转自https://blog.csdn.net/qq_20405005/article/details/77967358 前一阵子在做dying gasp功能测试,过程中恰好测试到了Linux的响应速 ...
- HTML播放FLASH(SWF)神器-SWFObject
环境 必须有 swfobject.js和 expressInstall.swf js: http://pan.baidu.com/share/link?shareid=2536087943& ...
- MySQL之EXPLAIN 执行计划详解
explain 可以分析 select 语句的执行,即 MySQL 的“执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好): | All | index ...
- testng运行失败,继续执行
1.重写断言类 public class Verify { public static StringBuffer verificationErrors= new StringBuffer();; pu ...
- springMVC源码分析--视图View(一)
之前的博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们已经介绍了数据返回值的处理,在博客springMVC源码分析--ViewResolver视图解析器( ...