`

Django REST framework Token认证不过期的解决方法

阅读更多

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


那么如何解决这个问题呢?首先呢,需要看一下TokenAuthentication这个模块的源码,里面有一段源码是这样的:

  1. def authenticate_credentials(self, key):# key=前端在请求头传过来的Token
  2. model = self.get_model()# 获取Token模块
  3. try:
  4. token = model.objects.select_related('user').get(key=key)# 通过key获取Token
  5. except model.DoesNotExist:
  6. raise exceptions.AuthenticationFailed(_('Invalid token.'))# 如果没有就报错
  7. ifnot token.user.is_active:# 如果用户没有激活也报错
  8. raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
  9. return(token.user, token)# 然后把Token和登录的用户返回给View

上面的代码比较简单,仔细观看一下TokenAuthentication模块就知道是怎么回事,但我们要解决的是每次验证成功之后都要进行一次过期验证,那么应该如何做呢?其实很简单,只需要扩展TokenAuthentication模块就可以了,兴建一个token.py文件,代码如下:

  1. from rest_framework.authentication importTokenAuthentication
  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. classExpiringTokenAuthentication(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. ifnot token.user.is_active:
  15. raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
  16. if timezone.now()>(token.created + timedelta(days=settings.TOKEN_LIFETIME)):# 重点就在这句了,这里做了一个Token过期的验证,如果当前的时间大于Token创建时间+7天,那么久返回Token已经过期
  17. raise exceptions.AuthenticationFailed(_('Token has expired'))
  18. return(token.user, token)

TOKEN_LIFETIME = 7

但是并没有结束,我们还需要修改login View,来确保如果过期都会刷新Token和更新时间,你可能需要添加如下代码:

  1. if user isnotNone:
  2. token, has_created =Token.objects.get_or_create(user=user)
  3. if timezone.now()>(token.created + timedelta(days=TOKEN_LIFETIME)):
  4. Token.objects.filter(user=user).update(key=token.generate_key(), created=timezone.now())

这是一个真实存在的问题,如果可以,我推荐你看下这篇文章

最后,你在View中使用Token验证的时候只需要把TokenAuthentication替换成ExpiringTokenAuthentication即可。

 

分享到:
评论

相关推荐

    Django REST framework讲义PDF全集,中文文档PDF版

    Django REST Framework(DRF)是基于Python的Django Web框架的一个强大扩展,专为构建Web API而设计。本讲义全面涵盖了这个框架的核心概念、功能以及最佳实践,旨在帮助开发者快速掌握如何利用DRF创建高效、可维护的...

    django rest framework vue 实现用户登录详解

    在Django REST framework中实现用户登录,需要在Django的视图(views.py)中编写API接口,通常使用TokenAuthentication或SessionAuthentication这两种认证方式。 #### TokenAuthentication 使用TokenAuthentication...

    Django restframework课件笔记详解

    Django REST framework(简称DRF)是Python Web开发领域中一个强大的工具,专门用于构建Web API。这个框架基于Django,提供了许多高级特性,使得开发者能够高效、灵活地构建高质量的RESTful API服务。本课件笔记将...

    django-rest-framework 官方文档

    Django REST Framework(简称DRF)是用于构建Web API的强大框架,它基于Python语言和Django Web框架。这个官方文档提供了全面的指南、教程和API参考,帮助开发者深入理解和使用DRF来创建高效、可维护的RESTful API。...

    基于django restframework.zip

    4. 认证与授权:Django REST framework内置了多种认证和授权策略,如Basic Auth、Token Auth、Session Auth等,可以根据项目需求选择合适的方式确保API的安全性。 5. 权限控制:框架允许自定义权限类,以便根据用户...

    Django rest framework中文

    Django REST framework(DRF)是一个强大的、灵活且易于使用的工具,旨在简化在Django项目中创建RESTful Web API的过程。接下来,我将详细介绍从零开始搭建一个Django REST framework中文教程所涉及的关键知识点。 ...

    Python库 | django-rest-framework-social-oauth2-1.0.1.tar.gz

    `django-rest-framework-social-oauth2` 是一个基于 Django Rest Framework 的社交认证扩展库,主要用于实现 OAuth2 身份验证流程。这个库使得 Django 应用能够轻松地集成各种社交媒体登录服务,如 Facebook、Google...

    django rest framework

    **Django REST Framework详解** Django REST Framework(简称DRF)是基于Python的Django Web框架构建RESTful API的强大工具。它提供了一套完整的解决方案,包括序列化、身份验证、权限控制、分页以及Web视图,使得...

    基于Django框架,使用Django REST framework前后端分离技术搭建的网上图书商店.zip

    在Django REST framework中,可以通过Token认证、Session认证等多种方式进行用户验证。项目可能采用了这些机制之一,确保只有合法用户能访问和操作图书商店的资源。 7. 数据库模型: Django中的数据库模型定义了...

    rest-framework生成token

    使用rest-framework在django中创建和认证token,用于在移动端来认证和用户,本文通过自己编写模型来实现根据用户来生成token,在请求头中添加Authentication来进行认证,保持登录状态。可以直接使用,编写过程可以...

    django rest framework 实现用户登录认证详解

    今天我们将详细探讨如何使用Django REST framework实现用户登录认证。 Django REST framework(DRF)是一个强大的、灵活的工具集,用于构建Web API。它提供了很多用于序列化、权限控制、版本管理等功能的组件,其中...

    django rest frame work中文电子参考文档

    Django REST Framework(简称DRF)是一个强大的、灵活的、用于构建Web API的高级框架,它基于Python语言和Django Web框架。这个“Django REST framework中文电子参考文档”是针对DRF的详细教程,旨在帮助开发者更好...

    django-rest-framework-cn

    ### Django REST Framework 知识点解析 #### 一、简介 Django REST Framework(DRF)是一款强大且灵活的工具包,旨在简化构建Web API的过程。它基于Django Web框架,利用其强大的特性来处理复杂的数据库操作、身份...

    Python-DjangoREST框架的无密码验证

    在Python的Web开发领域,Django REST框架(Django REST framework,简称DRF)是一个强大的工具,用于构建可扩展的、高性能的APIs。而"Python-Django REST框架的无密码验证"则涉及到了现代应用中的一种身份验证方法,...

    django rest framework 源码包

    **Django REST Framework(DRF)源码解析** Django REST Framework(简称DRF)是基于Python的Web API开发框架,专为构建高效、可维护的RESTful API而设计。它与Django web框架深度集成,提供了丰富的工具和功能,...

    Building APIs with Django and Django Rest Framework

    ### 构建API:使用Django与Django Rest Framework #### 一、简介 构建API:使用Django与Django Rest Framework这本书旨在帮助读者掌握如何使用Django框架及其流行的扩展库——Django Rest Framework(简称DRF)来...

    django-rest-framework-simplejwt-master_oppositemeq_encryption_dj

    接下来,“simplejwt”是指“Django REST Framework Simple JWT”,这是一个流行的身份验证库,它实现了JSON Web Token(JWT)认证机制。最后,“master”通常表示这是项目仓库的主分支。 **描述解析:** "Simple ...

    Django Rest framework之权限的实现示例

    在阅读本文之前请先参考django rest framework 之 认证 中关于 django rest framework 的相关内容及实例 1、目录结构 为了更好的管理各个功能组件,在django rest framework 之 认证 中我们说到可以将认证类单独的拿...

    Django REST进阶学习资料

    Django REST Framework(简称DRF)是基于Python的Django Web框架的一个强大的扩展,它为构建Web API提供了高效、易用的工具集。本进阶学习资料将带你深入理解Django REST的高级特性,帮助你从初级用户晋升为熟练...

Global site tag (gtag.js) - Google Analytics