簡體   English   中英

DRF 要求使用 TokenAuthentication 作為唯一身份驗證方法的 CSRF 令牌

[英]DRF asking for CSRF Token with TokenAuthentication as the only auth method

我唯一的 DRF 身份驗證系統是 TokenAuthentication,它仍然在基於 function 的視圖上請求 CSRF 令牌。 我對基於 class 的視圖沒有這個問題。

設置.py:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication'
    ]
}

視圖.py:

@api_view(['POST'])
@authentication_classes([TokenAuthentication])
def submit_vote(request):
    # ...

在郵遞員的 POST 請求中:

Forbidden (CSRF cookie not set.): /rest/submit_vote/
[04/Nov/2020 02:05:38] "POST /rest/submit_vote/ HTTP/1.1" 403 2864

什么?!

我沒有任何待處理的遷移。

僅當使用SessionAuthentication才在 DRF 中啟用 CSRF。 用戶需要使用 session 登錄,強制 DRF 檢查 CSRF。

如果您使用TokenAuthentication ,DRF 將不會向客戶端發送 CSRF,並且在響應中的 cookie 中不需要 CSRF。

如果您有Forbidden (CSRF cookie not set.)那么您的代碼/瀏覽器可能存在一些問題:

  • 請仔細檢查您的任何視圖中是否沒有使用csrf_token標簽,如果您有這樣的視圖,它將強制 Django 向您發送 CSRF cookie
  • 請仔細檢查您的 cookie 中沒有 CSRF 令牌(只需清除所有 cookie),搜索X-CSRFToken
  • 請檢查服務器響應標頭的樣子,是否有 CSRF cookie? 它不應該在那里
  • 請檢查您的請求標頭的外觀,您是否在標頭中發送任何 cookie?

如果您仍然有問題,請提供一個最小的工作示例來重現此行為,我會幫助您。

Django 中的任何 POST、PUT、PATCH 或 DELETE 或請求都需要 CSRF 令牌。 如果您使用 Postman 發送請求, 請查看此 Medium 帖子以了解如何在 Postman 中設置 CSRF 令牌

您還可以通過添加csrf_exempt裝飾器來禁用csrf_token驗證。 不建議。

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

在一個項目中,前端使用令牌身份驗證,后端使用 session 身份驗證。

我發現只要你的瀏覽器中沒有 session cookie,DRF 只對不記名令牌感到滿意,但如果你登錄到管理員,那么不記名令牌也需要 CSRF 令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM