使用 JWT 在 Django 中触发 Stripe 事件会导致 401 Unauthorized

问题描述 投票:0回答:1

我正在将 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/
python django stripe-payments http-status-code-401 django-rest-framework-simplejwt
1个回答
0
投票

401 响应来自您的服务器,表明需要某种形式的身份验证。您应该删除服务器中的身份验证机制。

更多详细信息请参见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401

© www.soinside.com 2019 - 2024. All rights reserved.