如何实现Auth0与Django用户双向删除同步?
Django与Auth0用户双向删除同步实现方案
一、删除Django用户时同步删除Auth0用户
核心思路是在Django用户删除事件触发时,调用Auth0 Management API删除对应Auth0账号。
步骤1:关联Django用户与Auth0用户ID
确保你的Django用户模型(自定义模型或扩展默认User)中存储Auth0用户唯一ID:
# models.py from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): auth0_user_id = models.CharField(max_length=255, unique=True, null=True, blank=True)
用户通过Auth0登录时,将Auth0返回的user_id(格式通常为auth0|xxx)存入该字段。
步骤2:通过Django信号触发Auth0用户删除
首先在Auth0控制台创建具备delete:users权限的Machine-to-Machine应用,然后用Django的post_delete信号触发同步逻辑:
# signals.py import requests from django.db.models.signals import post_delete from django.dispatch import receiver from django.conf import settings from .models import CustomUser @receiver(post_delete, sender=CustomUser) def delete_auth0_user(sender, instance, **kwargs): if not instance.auth0_user_id: return # 获取Auth0 Management API访问令牌 token_url = f"https://{settings.AUTH0_DOMAIN}/oauth/token" token_payload = { "grant_type": "client_credentials", "client_id": settings.AUTH0_M2M_CLIENT_ID, "client_secret": settings.AUTH0_M2M_CLIENT_SECRET, "audience": f"https://{settings.AUTH0_DOMAIN}/api/v2/" } token_response = requests.post(token_url, json=token_payload) if not token_response.ok: # 记录令牌获取失败日志,可添加告警逻辑 return access_token = token_response.json()["access_token"] # 调用Auth0删除用户API delete_url = f"https://{settings.AUTH0_DOMAIN}/api/v2/users/{instance.auth0_user_id}" headers = {"Authorization": f"Bearer {access_token}"} delete_response = requests.delete(delete_url, headers=headers) if not delete_response.ok: # 记录删除失败日志,可考虑重试机制 pass
在apps.py中注册信号:
# apps.py from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' def ready(self): import your_app.signals
二、删除Auth0用户时同步删除Django用户
核心思路是利用Auth0 Webhook,在Auth0用户被删除时通知Django服务,触发本地用户删除。
步骤1:配置Auth0 Webhook
- 登录Auth0控制台,进入**"Automation > Webhooks"**,点击"Create Webhook"。
- 设置Webhook名称,填写Django服务的接收端点(例如
https://your-domain.com/api/auth0/user-deleted)。 - 在"Events"中选择
user.delete事件,保存配置。 - 记录Webhook的签名密钥(用于后续请求合法性验证)。
步骤2:Django端实现Webhook接收端点
创建API视图接收Auth0的删除通知,验证请求签名后删除对应Django用户:
# views.py import hmac import hashlib import json from django.conf import settings from django.http import HttpResponse, HttpResponseBadRequest from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST from .models import CustomUser @csrf_exempt @require_POST def auth0_user_deleted_webhook(request): # 验证Auth0请求签名 signature_header = request.headers.get('X-Auth0-Signature') if not signature_header: return HttpResponseBadRequest("Missing signature") secret = settings.AUTH0_WEBHOOK_SECRET.encode('utf-8') computed_signature = hmac.new( secret, request.body, digestmod=hashlib.sha256 ).hexdigest() if not hmac.compare_digest(computed_signature, signature_header): return HttpResponseBadRequest("Invalid signature") # 解析请求体获取Auth0用户ID payload = json.loads(request.body) auth0_user_id = payload.get('data', {}).get('user_id') if not auth0_user_id: return HttpResponseBadRequest("Missing user_id") # 删除Django中对应用户(保证幂等性,删除不存在用户不报错) CustomUser.objects.filter(auth0_user_id=auth0_user_id).delete() return HttpResponse(status=200)
在urls.py中配置路由:
# urls.py from django.urls import path from . import views urlpatterns = [ path('api/auth0/user-deleted', views.auth0_user_deleted_webhook, name='auth0-user-deleted-webhook'), ]
关键注意事项
- Auth0权限配置:Machine-to-Machine应用必须拥有
delete:users权限,否则无法调用删除API。 - 网络可靠性:可添加重试机制(如使用
tenacity库)处理临时网络故障。 - 幂等性:Webhook端点需支持重复调用,避免重复删除引发异常。
- 测试验证:先在测试环境分别测试双向删除场景,确保同步逻辑正常运行。
内容的提问来源于stack exchange,提问作者Khubaib Khawar
相关产品推荐
相关产品推荐

