首先你需要知道在REST框架中的Token认证不像Session认证一样,它是没有办法设置过期时间的,但是有时我们需要对Token做过期验证,比如说用户在A设备登陆之后获取一个Token,如果用户在没有清空浏览器缓存的情况下,Token将一直保存在缓存中,一周后在访问依旧有效,但我们并不希望这样,我们觉得Token认证应该和Session一样都有过期时间,过期之后作废。
那么如何解决这个问题呢?首先呢,需要看一下TokenAuthentication
这个模块的源码,里面有一段源码是这样的:
def authenticate_credentials(self, key):# key=前端在请求头传过来的Token
model = self.get_model()# 获取Token模块
try:
token = model.objects.select_related('user').get(key=key)# 通过key获取Token
except model.DoesNotExist:
raise exceptions.AuthenticationFailed(_('Invalid token.'))# 如果没有就报错
ifnot token.user.is_active:# 如果用户没有激活也报错
raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
return(token.user, token)# 然后把Token和登录的用户返回给View
上面的代码比较简单,仔细观看一下TokenAuthentication
模块就知道是怎么回事,但我们要解决的是每次验证成功之后都要进行一次过期验证,那么应该如何做呢?其实很简单,只需要扩展TokenAuthentication
模块就可以了,兴建一个token.py
文件,代码如下:
from rest_framework.authentication importTokenAuthentication
from django.utils.translation import ugettext_lazy as _
from rest_framework import exceptions
from django.utils import timezone
from datetime import timedelta
from django.conf import settings
classExpiringTokenAuthentication(TokenAuthentication):
def authenticate_credentials(self, key):
model = self.get_model()
try:
token = model.objects.select_related('user').get(key=key)
except model.DoesNotExist:
raise exceptions.AuthenticationFailed(_('Invalid token.'))
ifnot token.user.is_active:
raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
if timezone.now()>(token.created + timedelta(days=settings.TOKEN_LIFETIME)):# 重点就在这句了,这里做了一个Token过期的验证,如果当前的时间大于Token创建时间+7天,那么久返回Token已经过期
raise exceptions.AuthenticationFailed(_('Token has expired'))
return(token.user, token)
TOKEN_LIFETIME = 7
但是并没有结束,我们还需要修改login View
,来确保如果过期都会刷新Token和更新时间,你可能需要添加如下代码:
if user isnotNone:
token, has_created =Token.objects.get_or_create(user=user)
if timezone.now()>(token.created + timedelta(days=TOKEN_LIFETIME)):
Token.objects.filter(user=user).update(key=token.generate_key(), created=timezone.now())
这是一个真实存在的问题,如果可以,我推荐你看下这篇文章。
最后,你在View中使用Token验证的时候只需要把TokenAuthentication
替换成ExpiringTokenAuthentication
即可。
相关推荐
Django REST Framework(DRF)是基于Python的Django Web框架的一个强大扩展,专为构建Web API而设计。本讲义全面涵盖了这个框架的核心概念、功能以及最佳实践,旨在帮助开发者快速掌握如何利用DRF创建高效、可维护的...
在Django REST framework中实现用户登录,需要在Django的视图(views.py)中编写API接口,通常使用TokenAuthentication或SessionAuthentication这两种认证方式。 #### TokenAuthentication 使用TokenAuthentication...
Django REST framework(简称DRF)是Python Web开发领域中一个强大的工具,专门用于构建Web API。这个框架基于Django,提供了许多高级特性,使得开发者能够高效、灵活地构建高质量的RESTful API服务。本课件笔记将...
Django REST Framework(简称DRF)是用于构建Web API的强大框架,它基于Python语言和Django Web框架。这个官方文档提供了全面的指南、教程和API参考,帮助开发者深入理解和使用DRF来创建高效、可维护的RESTful API。...
4. 认证与授权:Django REST framework内置了多种认证和授权策略,如Basic Auth、Token Auth、Session Auth等,可以根据项目需求选择合适的方式确保API的安全性。 5. 权限控制:框架允许自定义权限类,以便根据用户...
Django REST framework(DRF)是一个强大的、灵活且易于使用的工具,旨在简化在Django项目中创建RESTful Web API的过程。接下来,我将详细介绍从零开始搭建一个Django REST framework中文教程所涉及的关键知识点。 ...
`django-rest-framework-social-oauth2` 是一个基于 Django Rest Framework 的社交认证扩展库,主要用于实现 OAuth2 身份验证流程。这个库使得 Django 应用能够轻松地集成各种社交媒体登录服务,如 Facebook、Google...
**Django REST Framework详解** Django REST Framework(简称DRF)是基于Python的Django Web框架构建RESTful API的强大工具。它提供了一套完整的解决方案,包括序列化、身份验证、权限控制、分页以及Web视图,使得...
在Django REST framework中,可以通过Token认证、Session认证等多种方式进行用户验证。项目可能采用了这些机制之一,确保只有合法用户能访问和操作图书商店的资源。 7. 数据库模型: Django中的数据库模型定义了...
使用rest-framework在django中创建和认证token,用于在移动端来认证和用户,本文通过自己编写模型来实现根据用户来生成token,在请求头中添加Authentication来进行认证,保持登录状态。可以直接使用,编写过程可以...
今天我们将详细探讨如何使用Django REST framework实现用户登录认证。 Django REST framework(DRF)是一个强大的、灵活的工具集,用于构建Web API。它提供了很多用于序列化、权限控制、版本管理等功能的组件,其中...
Django REST Framework(简称DRF)是一个强大的、灵活的、用于构建Web API的高级框架,它基于Python语言和Django Web框架。这个“Django REST framework中文电子参考文档”是针对DRF的详细教程,旨在帮助开发者更好...
### Django REST Framework 知识点解析 #### 一、简介 Django REST Framework(DRF)是一款强大且灵活的工具包,旨在简化构建Web API的过程。它基于Django Web框架,利用其强大的特性来处理复杂的数据库操作、身份...
在Python的Web开发领域,Django REST框架(Django REST framework,简称DRF)是一个强大的工具,用于构建可扩展的、高性能的APIs。而"Python-Django REST框架的无密码验证"则涉及到了现代应用中的一种身份验证方法,...
**Django REST Framework(DRF)源码解析** Django REST Framework(简称DRF)是基于Python的Web API开发框架,专为构建高效、可维护的RESTful API而设计。它与Django web框架深度集成,提供了丰富的工具和功能,...
### 构建API:使用Django与Django Rest Framework #### 一、简介 构建API:使用Django与Django Rest Framework这本书旨在帮助读者掌握如何使用Django框架及其流行的扩展库——Django Rest Framework(简称DRF)来...
接下来,“simplejwt”是指“Django REST Framework Simple JWT”,这是一个流行的身份验证库,它实现了JSON Web Token(JWT)认证机制。最后,“master”通常表示这是项目仓库的主分支。 **描述解析:** "Simple ...
在阅读本文之前请先参考django rest framework 之 认证 中关于 django rest framework 的相关内容及实例 1、目录结构 为了更好的管理各个功能组件,在django rest framework 之 认证 中我们说到可以将认证类单独的拿...
Django REST Framework(简称DRF)是基于Python的Django Web框架的一个强大的扩展,它为构建Web API提供了高效、易用的工具集。本进阶学习资料将带你深入理解Django REST的高级特性,帮助你从初级用户晋升为熟练...