django动态Token两种方案思考

修改token原生验证方式

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.'))  # 如果没有就报错

    if not token.user.is_active: # 如果用户没有激活也报错
        raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))

    return (token.user, token) # 然后把Token和登录的用户返回给View

再在此基础上加一个时间校验, 建一个token.py文件:

from rest_framework.authentication import TokenAuthentication
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

class ExpiringTokenAuthentication(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.'))
        if not 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 is not None:
     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即可。

rest作api+自作验证装饰器方式

django rest api 不作认证,自写一个token认证的装饰器,redis存token,并作有效期

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容