Триггерные события 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