[英]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 cookieX-CSRFToken
,如果您仍然有問題,請提供一個最小的工作示例來重現此行為,我會幫助您。
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.