我正在尝试访问受DRF session authentication保护的API端点。这需要在请求标头中传递CSRF cookie,这是我在Django docs之后完成的,如下所示:
import * as Cookies from "js-cookie";
var csrftoken = Cookies.get('csrftoken');
fetch('/api/myendpoint', { headers: { 'X-CSRFToken': csrftoken }})
.then(response => ...)
我在settings.py中启用了会话身份验证,如下所示:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
Django登录和身份验证对普通页面正常工作,但不适用于我的API调用。我总是在响应中收到403错误
未提供身份验证凭据。
我已经通过查看Chrome网络面板中的请求检查了X-CSRFToken标头值是否已正确设置为当前的csrftoken cookie值。
答案 0 :(得分:1)
找到答案here。 csrftoken不应该在GET的请求头中。取而代之的是,
fetch('/api/workflows', { credentials: 'include' })...
,其中包含Cookie,如Fetch docs。
中所述仍然必须为PUT,PATCH和DELETE请求设置X-CSRFToken