使用Django OAuth Toolkit与Celery实现自动化令牌清理
场景介绍
在OAuth 2.0授权服务器的日常运维中,随着时间推移,数据库中会积累大量过期令牌(包括访问令牌和刷新令牌)。这些过期数据不仅占用存储空间,还可能影响系统性能。虽然Django OAuth Toolkit提供了cleartokens
管理命令来手动清理,但更优雅的解决方案是使用Celery实现自动化定时清理。
技术选型分析
为了实现自动化清理,我们需要以下组件协同工作:
- 消息队列:作为Celery的后端,负责任务分发。本文以RabbitMQ为例,它是Celery推荐的Broker之一。
- Celery:分布式任务队列,负责执行异步任务。
- django-celery-beat:Celery的Django扩展,提供基于数据库的定时任务调度功能。
环境配置
RabbitMQ安装指南
RabbitMQ作为消息中间件,需要在系统层面先进行安装:
MacOS系统
推荐使用Homebrew安装:
brew install rabbitmq
brew service start rabbitmq
Docker方式
对于开发环境,使用Docker最为便捷:
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
Windows系统
请参考RabbitMQ官方Windows安装文档。
Celery相关包安装
在Python虚拟环境中安装必要依赖:
pip install celery django-celery-beat
Django项目集成
配置修改
首先需要将相关应用添加到INSTALLED_APPS
中:
INSTALLED_APPS = [
# 其他应用...
"tutorial", # 你的OAuth服务器应用
"django_celery_beat",
]
Celery应用配置
创建celery.py
文件初始化Celery应用:
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tutorial.settings')
app = Celery('tutorial', broker="pyamqp://guest@localhost//")
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
清理任务实现
创建tasks.py
定义清理任务:
from celery import shared_task
@shared_task
def clear_tokens():
from oauth2_provider.models import clear_expired
clear_expired()
应用初始化
确保Celery应用随Django启动:
# __init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)
服务启动与配置
启动服务组件
需要分别启动三个服务:
- RabbitMQ(已安装并启动)
- Celery Beat(任务调度器)
celery -A tutorial beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
- Celery Worker(任务执行器)
celery -A tutorial worker -l INFO
定时任务配置
通过Django Admin界面配置:
-
创建间隔时间(Interval Schedule)
- 访问间隔计划管理页面
- 设置间隔为10秒(开发环境方便观察)
-
创建周期性任务(Periodic Task)
- 选择
tutorial.tasks.clear_tokens
任务 - 关联上一步创建的间隔计划
- 保存配置
- 选择
运行效果验证
成功配置后,可以在日志中观察到:
Beat调度器日志:
[时间戳] Scheduler: Sending due task clear stale tokens (tutorial.tasks.clear_tokens)
Worker执行日志:
[时间戳] Task tutorial.tasks.clear_tokens[任务ID] received
[时间戳] 0 Expired access tokens deleted
[时间戳] Task succeeded in 处理时间s: None
生产环境建议
- 清理频率:生产环境建议设置为每天或每周执行,而非示例中的10秒
- 监控:建议添加任务执行结果的监控和告警
- 性能:对于大型系统,可能需要考虑分批次清理以避免数据库锁等问题
- 备份:重要操作前建议进行数据库备份
通过以上配置,你的Django OAuth Toolkit授权服务器将自动保持数据库清洁,无需人工干预,大大提升了系统的可维护性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考