Несанкционированная ошибка Django Webhook в Azure, несмотря на успешное локальное тестирование

У меня есть проект Django + React, размещенный на Azure. Я использую Azure Postgres в качестве своей базы данных, и мой обработчик webhook настроен на получение событий от внешнего API (подписки на печать). Событие webhook subscriptions/create отправляет запрос POST на мой сервер Django по адресу:

https://vitaverde-backend.greensky-92f80007.eastus.azurecontainerapps.io/shopify/webhook/subscription/

Однако я продолжаю получать следующую ошибку в моем потоке серверного журнала Azure:

ws 11 128676314590080 Received webhook request
2025-03-04T00:39:38.1700588Z stderr F ERROR 2025-03-04 00:39:38,169 views 11 128676314590080 Unauthenticated user request
2025-03-04T00:39:38.1701766Z stderr F WARNING 2025-03-04 00:39:38,170 log 11 128676314590080 Unauthorized: /shopify/webhook/subscription/

Предпринятые шаги по отладке

  1. Протестировал Webhook локально:

    • Я написал test_webhook.sh скрипт, который успешно отправляет запрос POST с правильными заголовками и подписью HMAC.
    • Веб-узел корректно сохраняет данные в моей базе данных Azure Postgres.

    Тестовый сценарий:

    #!/bin/bash
    
    PAYLOAD='{"test": true, "customer": {"first_name": "Test", "last_name": "User", "email": "test@example.com"}}'
    
    SEAL_SECRET="seal_secret_****************************"
    SIGNATURE=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "$SEAL_SECRET" | cut -d' ' -f2)
    
    curl -X POST \
      "https://vitaverde-backend.greensky-92f80007.eastus.azurecontainerapps.io/shopify/webhook/customer-creation/" \
      -H "Content-Type: application/json" \
      -H "X-Seal-Token: seal_token_*************************" \
      -H "X-Seal-Hmac-Sha256: $SIGNATURE" \
      -d "$PAYLOAD" \
      -v
    
    echo -e "\n\nPayload: $PAYLOAD"
    echo "Signature: $SIGNATURE"
    
  2. Гарантированное исключение из CSRF для Webhook:

    • В settings.py, Я добавил конечную точку webhook в CSRF_EXEMPT_URLS:

      CSRF_EXEMPT_URLS = [
          'shopify/webhook/subscription/',
          'shopify/webhook/customer-creation/',
          'api/customer/webhook/seal-delivery/',
      ]
      
    • Явно разрешенный домен в CSRF_TRUSTED_ORIGINS:

      CSRF_TRUSTED_ORIGINS = [
          'https://vitaverde-frontend.greensky-92f80007.eastus.azurecontainerapps.io',
          'https://www.vitaverde.store',
          'https://vitaverde.store',
          'http://localhost:3000',
          'https://app.sealsubscriptions.com',
      ]
      
  3. Конфигурация просмотра веб-узла:

    • Я убедился, что мой просмотр в webhook не требует аутентификации и не поддерживает CSRF:

      from django.views.decorators.csrf import csrf_exempt
      from rest_framework.decorators import api_view, permission_classes
      from rest_framework.permissions import AllowAny
      from django.http import JsonResponse
      
      @csrf_exempt
      @api_view(['POST'])
      @permission_classes([AllowAny])
      def shopify_webhook_subscription(request):
          # Process webhook payload
          return JsonResponse({"message": "Webhook received"}, status=200)
      

Проблема

  • Веб-хук работает нормально при тестировании с помощью test_webhook.sh.
  • Однако, когда Подписывает подписки, мои журналы Django показывают ошибку аутентификации.
  • Это заставляет меня подозревать проблему с заголовками запросов, применением CSRF или настройками CORS в Azure.

Вопросы

  1. Почему webhook завершается ошибкой только тогда, когда Seal Subscriptions отправляет запрос?
  2. Может ли Azure применять дополнительные проверки безопасности, блокирующие внешние запросы?
  3. Как я могу отладить это дальше, чтобы точно узнать, какие заголовки запросов отправляет Seal Subscriptions?

Мы были бы очень признательны за любую информацию! 🚀

Вернуться на верх