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的过期令牌自动删除并非实时后台任务,仅在以下场景触发:
- 用户使用新令牌登录时,会清理该用户名下所有过期令牌
- 每次令牌认证请求时,会检查当前令牌是否过期,若过期则拒绝请求并删除该令牌
- 手动执行清理命令批量删除所有过期令牌:
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
相关产品推荐
相关产品推荐

