You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-rest-knox 4.1.0过期令牌未自动删除问题求助

解决django-rest-knox 4.1.0过期令牌未自动失效及删除问题

一、排查令牌验证逻辑是否生效

首先确认视图的认证配置是否正确:

  • 类视图需继承rest_framework.views.APIView,未覆盖authentication_classes属性,或已明确指定knox.auth.TokenAuthentication
  • 函数视图需添加@authentication_classes([knox.auth.TokenAuthentication])和@permission_classes([IsAuthenticated])装饰器

若验证逻辑未生效,过期令牌会被正常放行。可在视图中打印request.user,确认令牌过期时是否返回401状态码。

二、明确knox的令牌清理机制

knox的过期令牌自动删除并非实时后台任务,仅在以下场景触发:

  1. 用户使用新令牌登录时,会清理该用户名下所有过期令牌
  2. 每次令牌认证请求时,会检查当前令牌是否过期,若过期则拒绝请求并删除该令牌
  3. 手动执行清理命令批量删除所有过期令牌:
    python manage.py knox_cleanup
    

若需定时自动清理,可借助django-cron或APScheduler等工具,定时执行上述命令。

三、修正settings.py配置问题

你的配置中AUTH_TOKEN_CHARACTER_LENGTH设为321,但knox数据库表中digest字段默认最大长度为64,过长的长度会导致令牌存储异常,进而影响过期验证逻辑。建议修改为64以内的值:

REST_KNOX = {
    "SECURE_HASH_ALGORITHM": "cryptography.hazmat.primitives.hashes.SHA512",
    "AUTH_TOKEN_CHARACTER_LENGTH": 64,
    "TOKEN_TTL": timedelta(minutes=10),
}

修改后重新生成令牌,测试过期后的请求响应。

四、手动验证令牌过期状态

可通过django shell手动检查令牌是否过期:

from knox.models import AuthToken
from datetime import datetime

token = AuthToken.objects.first()
# 检查令牌是否过期
if token.expires < datetime.now(token.expires.tzinfo):
    print("令牌已过期")
    token.delete()
else:
    print("令牌未过期")

若此处显示令牌已过期但数据库未自动删除,说明未触发自动清理的条件,需手动执行清理命令或发起认证请求触发验证。

内容的提问来源于stack exchange,提问作者fazilajafarli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:48:23