我想将我的应用程序后端从 Django 3.1.14(工作正常,但不再受支持)更新到较新的版本(我尝试了 3.2 和 4.0),但更新后我开始收到 CSRF cookie 错误。
禁止(未设置 CSRF cookie。):/api-token-auth/
有人知道 Django 在 CSRF 方面发生了什么变化,以及如何避免错误吗?
我的印象是,当使用 Django Rest Framework 进行令牌身份验证时,CSRF 并未强制执行。无论如何,我尝试删除
'django.middleware.csrf.CsrfViewMiddleware'
中间件,将 @csrf_exempt
添加到所有视图,删除所有现有令牌并退出 Django 管理,但无济于事。我在settings.py
中的DRF配置如下:
INSTALLED_APPS = [
'rest_framework',
'rest_framework.authtoken',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
编辑:下面是我自己的答案
urlpatterns
中的urls.py
顺序是问题所在。 这个答案有帮助。
如果 Django 管理 url 位于 api url 之上,则任何 api 请求都不会到达这些 api,并且 Django 将抛出 CSRF cookie 错误。
在 Django 3.1 中工作,但在 Django 3.2 中不起作用:
urlpatterns = [
path('', admin.site.urls),
url(r'^api-token-auth/', views.MyLoginToken.as_view()),
url(r'^', include('myapp.backend.urls')),
]
在 Django 3.2 中工作:
urlpatterns = [
url(r'^', include('myapp.backend.urls')), # move CSRF exempt apis to the top
url(r'^api-token-auth/', views.MyLoginToken.as_view()),
path('', admin.site.urls), # move CSRF protected endpoints to the end
]
我找不到任何有关从 Django 3.1 到 Django 3.2 的重大更改的文档。
如果您像我一样在从 3.2 更新到 4.2 时遇到类似问题,请在此处回答:禁止(来源检查失败 - https://api.example.com 与任何可信来源不匹配。):/admin/login /