Триггерные события Stripe приводят к 401 Unauthorized в Django с помощью JWT

Я интегрирую stripe в проект django и получаю несанкционированный 401 при каждой попытке связаться с моей конечной точкой webhook от stripe. Возможно, эта проблема возникла в результате перехода на JWT с традиционной REST-аутентификации.

Спасибо всем за помощь и, пожалуйста, дайте мне знать, какую еще информацию я могу предоставить, чтобы помочь. При выполнении следующей команды я получаю следующие ошибки.

Пожалуйста, дайте мне знать, если вы можете что-то сделать, я искал далеко и широко в течение нескольких дней в попытке решить эту проблему. Спасибо.

stripe trigger invoice.payment_succeeded
2024-12-02 20:46:06   --> customer.created
2024-12-02 20:46:06  <--  [401] POST http://localhost:8000/collect-stripe-webhook/

Вот конечная точка, о которой идет речь:

@csrf_exempt
@api_view(\['POST'\])
@authentication_classes(\[\])  # Disable authentication
@permission_classes(\[AllowAny\])  # Allow any request
def collect_stripe_webhook(request):
webhook_secret = os.getenv('STRIPE_WEBHOOK_SECRET')
signature = request.META.get("HTTP_STRIPE_SIGNATURE")
payload = request.body

    try:
        # Verify Stripe webhook signature
        event = stripe.Webhook.construct_event(
            payload=payload, sig_header=signature, secret=webhook_secret
        )
    except ValueError:
        return JsonResponse({'error': 'Invalid payload'}, status=400)
    except stripe.error.SignatureVerificationError:
        return JsonResponse({'error': 'Invalid signature'}, status=400)
    
    # Process the event
    print(f"Webhook received: {event['type']}")
    return JsonResponse({'status': 'success'})

Пожалуйста, найдите ниже несколько строк из файла settings.py

ALLOWED_HOSTS = []

#CSRF 
ALLOWED_HOSTS = [
    '127.0.0.1', 
    'localhost']


CORS_ALLOW_ALL_ORIGINS = True

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:8000', 
    'http://localhost:5173'
    ]

CORS_ORIGIN_WHITELIST = [
    'http://localhost:8000',
    'http://127.0.0.1:8000'
    ]
CORS_ALLOWED_ORIGINS = [
    "http://localhost:5173",
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

REST_USE_JWT = True


SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5000),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=90),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'UPDATE_LAST_LOGIN': False,

    'ALGORITHM': 'HS256',
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

urls.py

    path('collect-stripe-webhook/', collect_stripe_webhook, name='collect-stripe-webhook'),
   path('collect-stripe-webhook/', include('project_app.urls'))

Кроме того, при переходе на localhost:8000/collect-stripe-webhook из браузера моей машины выдается HTTP 200 OK.

В попытке решить эту проблему я использовал AllowAny в классах разрешений по умолчанию. Конечно, это не лучшее долгосрочное решение, однако, как ни странно, оно привело к 405 ошибкам, как показано ниже.

2024-12-02 20:54:06   --> invoice.payment_succeeded
2024-12-02 20:54:06  <--  [405] POST http://localhost:8000/collect-stripe-webhook/

Ответ 401 приходит с вашего сервера, указывая на то, что требуется определенная форма аутентификации. Вам следует удалить механизм аутентификации на вашем сервере.

Более подробная информация здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401

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