REST框架中的Token认证不像Session认证一样,它是没有办法设置过期时间的,但是有时我们需要对Token做过期验证,比如说用户在A设备登陆之后获取一个Token,如果用户在没有清空浏览器缓存的情况下,Token将一直保存在缓存中,一周后在访问依旧有效,但我们并不希望这样,我们觉得Token认证应该和Session一样都有过期时间,过期之后作废。

  1. 首先,看下TokenAuthentication模块的源码如下:

    1. class TokenAuthentication(BaseAuthentication):
    2. keyword = 'Token'
    3. model = None
    4. def get_model(self):
    5. if self.model is not None:
    6. return self.model
    7. from rest_framework.authtoken.models import Token
    8. return Token
    9. def authenticate(self, request):
    10. auth = get_authorization_header(request).split()
    11. if not auth or auth[0].lower() != self.keyword.lower().encode():
    12. return None
    13. if len(auth) == 1:
    14. msg = _('Invalid token header. No credentials provided.')
    15. raise exceptions.AuthenticationFailed(msg)
    16. elif len(auth) > 2:
    17. msg = _('Invalid token header. Token string should not contain spaces.')
    18. raise exceptions.AuthenticationFailed(msg)
    19. try:
    20. token = auth[1].decode()
    21. except UnicodeError:
    22. msg = _('Invalid token header. Token string should not contain invalid characters.')
    23. raise exceptions.AuthenticationFailed(msg)
    24. return self.authenticate_credentials(token)
    25. def authenticate_credentials(self, key): # key=前端在请求头传过来的Token
    26. model = self.get_model() # 获取Token模块
    27. try:
    28. token = model.objects.select_related('user').get(key=key) # 通过key获取Token
    29. except model.DoesNotExist:
    30. raise exceptions.AuthenticationFailed(_('Invalid token.')) # 如果没有就报错
    31. if not token.user.is_active:
    32. raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) # 如果用户没有激活也报错
    33. return (token.user, token)
    34. def authenticate_header(self, request):
    35. return self.keyword # 然后把Token和登录的用户返回给View

上面有注解的地方是关键。 过期验证,就相当于多加一个判断,只要继承该类,然后重写authenticate_credentials方法即可。以下是我实现的例子,以expiringTokenAuthentication.py保存。

  1. from rest_framework.authentication import TokenAuthentication
  2. from django.utils.translation import ugettext_lazy as _
  3. from rest_framework import exceptions
  4. from django.utils import timezone
  5. from datetime import timedelta
  6. from django.conf import settings
  7. class ExpiringTokenAuthentication(TokenAuthentication):
  8. def authenticate_credentials(self, key):
  9. model = self.get_model()
  10. try:
  11. token = model.objects.select_related('user').get(key=key)
  12. except model.DoesNotExist:
  13. raise exceptions.AuthenticationFailed(_('Invalid token.'))
  14. if not token.user.is_active:
  15. raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
  16. if timezone.now() > (token.created + timedelta(DAYS)): # 重点就在这句了,这里做了一个Token过期的验证,如果当前的时间大于Token创建时间+DAYS天,那么久返回Token已经过期
  17. raise exceptions.AuthenticationFailed(_('Token has expired'))
  18. return (token.user, token)

以此类推, 要对token进行类似的判断,都可以按上面的代码进行仿写。

Django restframework Token拥有不过期的认证的更多相关文章

  1. Django:RestFramework之-------认证

    3 restframework-认证 3.1APIView 认证: 认证是否已经登陆,如果已经登陆返回元组,如果没有登陆报错 源码流程: 执行dispatch方法: def dispatch(self ...

  2. django restframework 的日常使用

    本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...

  3. 基于token的多平台身份认证架构设计

    基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...

  4. django restframework

    一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...

  5. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  6. Django组件 - cookie、session、用户认证组件

    一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...

  7. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  8. Django Rest Framework源码剖析(一)-----认证

    一.简介 Django REST Framework(简称DRF),是一个用于构建Web API的强大且灵活的工具包. 先说说REST:REST是一种Web API设计标准,是目前比较成熟的一套互联网 ...

  9. Django Restframework 实践(一)

    具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...

随机推荐

  1. Built(最小生成树+构图离散化)

    个人心得:看了题目很明确,最小生成树,但是但是周赛卡住了,因为10W的点若一个一个找出距离很明显内存和时间都炸了, 静下心来,画了下图,仔细一想,任意一个点都只会在她左右俩边选择建立联系,那么我们只要 ...

  2. c#开发的程序安装时动态指定windows服务名称

    转自:http://www.jb51.net/article/30549.htm 前段时间由于项目的需求,要在Windows里把同样的组件制作成多个不同名称的服务,这些服务完成类似的功能,仅需要修改业 ...

  3. py2exe转换参数

    在公司用python写了个统计数据并通过xlsxwriter模块生成excel的小工具, 完成后使用py2exe转换成exe文件过程中遇到了些问题, 记录下. from distutils.core ...

  4. Tornado部署与运行

    运行多个Tornado实例 网页响应不是特别的计算密集型处理多个实例充分利用 CPU多端口怎么处理4.使用Supervisor监控Tornado进程安装(注意看是否需要指定使用python2版本) s ...

  5. 随着tomcat一起启动一个线程

    package test; import javax.servlet.*; public class MyCode implements ServletContextListener { //当Tom ...

  6. C#机器学习插件 ---- AForge.NET

    目录 简介 主要架构 特点 学习之旅 简介 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能, ...

  7. CDN初学搭建(ats)

    CDN初学搭建(ats) ats trafficserver squid 一. CDN初学搭建 准备vagrant virtualbox 内部环境测试所需包 一.vagrant创建启动虚拟机 1 mk ...

  8. odoo 使用源码安装时的注意

    odoo 使用源码安装时的注意 使用 odoo 源安装 odoo 时,会增加 odoo 官方的 odoo 源. 安装时直接输入 yum install odoo 即可安装 odoo. 但是更新时就要注 ...

  9. 在 CentOS 7.2 上安装 ODOO 10 (2018-10-09 持续更新)

    在 CentOS 7.2 上安装 ODOO 10 更新系统 yum update 安装 EPEL 源 1 yum install -y epel-release 安装依赖组件 yum install ...

  10. BZOJ2384:[CEOI2014]Match

    浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...