【问题标题】:CSRF cookie error after Django 3.2 update (DRF with token authentication)Django 3.2 更新后的 CSRF cookie 错误(带有令牌认证的 DRF)
【发布时间】:2022-02-10 01:14:48
【问题描述】:

我希望将我的应用后端从 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-cors-headers 包了吗?
  • 是的django-cors-headers==3.11.0,这是撰写本文时最新的。

标签: django django-rest-framework csrf


【解决方案1】:

urls.py 中的 urlpatterns 顺序是问题所在。 This 回答有帮助。

如果 Django admin url 在 api urls 之上,任何 api 请求甚至都不会到达这些 apis 并且 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 的重大更改的文档。

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2014-10-21
    • 2022-11-04
    • 2020-08-17
    • 2021-05-25
    • 2020-11-09
    • 1970-01-01
    • 2018-04-10
    • 2015-12-23
    相关资源
    最近更新 更多