Несанкционированная ошибка 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/
Предпринятые шаги по отладке
Протестировал 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"
- Я написал
Гарантированное исключение из 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', ]
Конфигурация просмотра веб-узла:
Я убедился, что мой просмотр в 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.
Вопросы
- Почему webhook завершается ошибкой только тогда, когда Seal Subscriptions отправляет запрос?
- Может ли Azure применять дополнительные проверки безопасности, блокирующие внешние запросы?
- Как я могу отладить это дальше, чтобы точно узнать, какие заголовки запросов отправляет Seal Subscriptions?
Мы были бы очень признательны за любую информацию! 🚀