Django 3.2 更新后 CSRF cookie 错误(带令牌身份验证的 DRF)

问题描述 投票:0回答:2

我想将我的应用程序后端从 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',
    ),
}

编辑:下面是我自己的答案

django django-rest-framework csrf
2个回答
4
投票

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 的重大更改的文档。


0
投票

如果您像我一样在从 3.2 更新到 4.2 时遇到类似问题,请在此处回答:禁止(来源检查失败 - https://api.example.com 与任何可信来源不匹配。):/admin/login /

© www.soinside.com 2019 - 2024. All rights reserved.