Django 3.2 更新后的 CSRF cookie 错误(DRF with token authentication)
CSRF cookie error after Django 3.2 update (DRF with token authentication)
我想将我的应用程序后端从 Django 3.1.14(工作正常但不再受支持)更新到更新的版本(我尝试了 3.2 和 4.0),但更新后我开始收到 CSRF cookie 错误。
Forbidden (CSRF cookie not set.): /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',
),
}
编辑:下面是我自己的回答
urls.py
中的 urlpatterns
顺序是问题所在。 This 回答有帮助。
如果 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 的重大更改的文档。
我想将我的应用程序后端从 Django 3.1.14(工作正常但不再受支持)更新到更新的版本(我尝试了 3.2 和 4.0),但更新后我开始收到 CSRF cookie 错误。
Forbidden (CSRF cookie not set.): /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',
),
}
编辑:下面是我自己的回答
urls.py
中的 urlpatterns
顺序是问题所在。 This 回答有帮助。
如果 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 的重大更改的文档。