我正在将 stripe 集成到 django 项目中,并且每次尝试通过 stripe 联系我的 webhook 端点时都会收到未经授权的 401 错误。这个问题可能是由于我从传统的 REST 身份验证切换到 JWT 而出现的。
感谢大家的帮助,请告诉我我还可以提供哪些其他有帮助的信息。 当我运行以下命令时,我收到以下错误。
如果有什么可以做的,请告诉我,我已经连续几天进行了广泛的搜索,试图解决这个问题。谢谢你。
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),
}
url.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