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

如何实现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

  1. 登录Auth0控制台,进入**"Automation > Webhooks"**,点击"Create Webhook"。
  2. 设置Webhook名称,填写Django服务的接收端点(例如https://your-domain.com/api/auth0/user-deleted)。
  3. 在"Events"中选择user.delete事件,保存配置。
  4. 记录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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:06:48