[英]Getting CSRF token missing error on a django rest framework (with TokenAuthentication) public APIView
我遇到了 Django Rest Framework 和 CSRF 配置的問題。 我知道在這個主題上有很多類似的帖子(比如這個Django Rest Framework remove csrf ),但大多數都不適用(我沒有使用 SessionAuthentication,也沒有使用 Django 模板),而且 DRF 處理 CSRF 的方式仍然不清楚對我來說。
這是情況:
APIView
用於注冊,我需要在其上發送 POST 請求。 此視圖不需要身份驗證。 當我發送 POST 請求時,我收到403 Forbidden error
並顯示以下消息: detail "CSRF Failed: CSRF token missing or incorrect."
這是我的觀點:
class RecaptchaVerifyView(APIView):
permission_classes = []
serializer_class = ReCaptchaSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
return Response({'success': True}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我讀過 DRF 禁用 CSRF,但我不使用的 SessionAuthentication 除外。 我還讀到空的permission_classes
應該可以解決大部分問題。 所以我想我不需要添加csrf_exempt
裝飾器(無論如何我都嘗試過但沒有成功)。
urls.py
的路由聲明如下:
urlpatterns = [
...
path('recaptcha_verify/', RecaptchaVerifyView.as_view(), name='recaptcha_verify'),
...
]
最后,一些相關的 Django 設置:
MIDDLEWARE = [
"corsheaders.middleware.CorsMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
...
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
另外,我不確定如何處理與 CSRF 相關的設置,例如SESSION_COOKIE_HTTPONLY
、 SESSION_COOKIE_SECURE
、 CSRF_COOKIE_SECURE
、 SESSION_COOKIE_NAME
、 CSRF_COOKIE_NAME
,即使是 CSRF 中間件本身。 無論我是否需要它們。
從我目前讀到的內容來看,我認為我根本不應該擔心 CSRF,因為 DRF 強制執行默認的 Django 行為,並且我使用的是 TokenAuthentication 而不是 SessionAuthentication。
我在這里做錯了什么?
PS:我還有另一個公共視圖(登錄頁面),它工作正常。
除了空的permission_classes
列表之外,設置中缺少的關鍵行是authentication_classes = ()
。
所以我的APIView
類現在看起來像這樣:
class RecaptchaVerifyView(APIView):
permission_classes = ()
authentication_classes = ()
@swagger_auto_schema(responses={status.HTTP_200_OK: openapi.Response("")})
def post(self, request, *args, **kwargs):
serializer = ReCaptchaSerializer(data=request.data)
if serializer.is_valid():
return Response({'success': True}, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
注冊視圖也是如此。 在這個上花了幾個小時,但現在 DRF 文檔說明沒有明確聲明authentication_classes
,默認SessionAuthentication
被強制執行,因此這需要 CSRF 令牌。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.