使用Django OAuth Toolkit与Celery实现自动化令牌清理

使用Django OAuth Toolkit与Celery实现自动化令牌清理

django-oauth-toolkit OAuth2 goodies for the Djangonauts! django-oauth-toolkit 项目地址: https://gitcode.com/gh_mirrors/dj/django-oauth-toolkit

场景介绍

在OAuth 2.0授权服务器的日常运维中,随着时间推移,数据库中会积累大量过期令牌(包括访问令牌和刷新令牌)。这些过期数据不仅占用存储空间,还可能影响系统性能。虽然Django OAuth Toolkit提供了cleartokens管理命令来手动清理,但更优雅的解决方案是使用Celery实现自动化定时清理。

技术选型分析

为了实现自动化清理,我们需要以下组件协同工作:

  1. 消息队列:作为Celery的后端,负责任务分发。本文以RabbitMQ为例,它是Celery推荐的Broker之一。
  2. Celery:分布式任务队列,负责执行异步任务。
  3. 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',)

服务启动与配置

启动服务组件

需要分别启动三个服务:

  1. RabbitMQ(已安装并启动)
  2. Celery Beat(任务调度器)
celery -A tutorial beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
  1. Celery Worker(任务执行器)
celery -A tutorial worker -l INFO

定时任务配置

通过Django Admin界面配置:

  1. 创建间隔时间(Interval Schedule)

    • 访问间隔计划管理页面
    • 设置间隔为10秒(开发环境方便观察)
  2. 创建周期性任务(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

生产环境建议

  1. 清理频率:生产环境建议设置为每天或每周执行,而非示例中的10秒
  2. 监控:建议添加任务执行结果的监控和告警
  3. 性能:对于大型系统,可能需要考虑分批次清理以避免数据库锁等问题
  4. 备份:重要操作前建议进行数据库备份

通过以上配置,你的Django OAuth Toolkit授权服务器将自动保持数据库清洁,无需人工干预,大大提升了系统的可维护性。

django-oauth-toolkit OAuth2 goodies for the Djangonauts! django-oauth-toolkit 项目地址: https://gitcode.com/gh_mirrors/dj/django-oauth-toolkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符汝姿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值