CSRF 验证不适用于使用 HTTPS 的 Django

CSRF validation does not work on Django using HTTPS

我正在开发一个应用程序,其前端是 AngularJS API,它向在 Django Rest Framework 中开发的后端 API 发出请求。

The frontend is on the domain: https://front.bluemix.net
And my backend is on the domain: https://back.bluemix.net

我在从前端 API 向后端 API 发出请求时遇到问题。错误是这样的:

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.

我正在使用 CORS,并且我已经在 Django 后端 settings.py 中包含以下行 API:

ALLOWED_HOSTS = []

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True


CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']

CORS_REPLACE_HTTPS_REFERER = True

CSRF_COOKIE_DOMAIN = 'bluemix.net'

CORS_ORIGIN_WHITELIST = (
    'https://front.bluemix.net/',
    'front.bluemix.net',
    'bluemix.net',
)

有人知道如何解决这个问题吗?

您的 CSRF_TRUSTED_ORIGINS 设置有误 - 将其更改为:

CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']

该设置需要 hostname only,而不是方案。无论如何,方案都是多余的,因为该设置仅在通过 HTTPS 连接时有效。

您可能还需要在 ALLOWED_HOSTS...

中添加一些内容

编辑:现在需要 Django 4.0 方案。

对于所有关注此内容的人,如果您已将 CORS_ORIGIN_ALLOW_ALL 设置为 True,则无需再设置 CORS_ORIGIN_WHITELIST 变量,因为您允许每个主机已经.

我的问题的解决方案 - 它可能会对某人有所帮助

我们遇到的问题很特殊,我们有一个客户端应用程序使用 TokenAuthentication 向另一个应用程序发送请求,这是一个使用 Django Admin 构建的 CRM,因此使用 会话验证。当我们打开 Django Admin 应用程序时,SessionMiddleware 正在为该域自动创建一个 session_id cookie。打开客户端应用程序并尝试执行请求时,出现以下错误:

Error: CSRF Failed: Referer checking failed - https://domainofthedjangoadminapp.com does not match any trusted origins.

那只是因为浏览器中已经设置了 session_id cookie,因此请求是使用 SessionAuthentication 而不是 TokenAuthentication 并失败。

删除 cookie 显然解决了问题。

如果您是 运行 Django 4.x,则需要更改语法以将架构作为值的一部分包含在内。

CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']

https://docs.djangoproject.com/en/dev/releases/4.0/#format-change

根据此文档。 https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes

  1. 通过以下方式安装 cors-header: pip install django-cors-headers

  2. 为您安装的应用程序添加 corsheaders

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'MyApp',
    'crispy_forms',
    'corsheaders',
    ]
    
  3. 将 corsheader 中间件添加到您的中间件

    MIDDLEWARE = [
    '**corsheaders.middleware.CorsMiddleware**',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
     ]
    

4 设置原点

 CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']

2022 年 4 月更新:

如果你的 django 版本"4.x.x":

python -m django --version

// 4.x.x

那么,如果错误如下图:

Origin checking failed - https://example.com does not match any trusted origins.

将下面的代码添加到 "settings.py":

CSRF_TRUSTED_ORIGINS = ['https://example.com']

在你的情况下,你遇到了与上面类似的错误:

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.

因此,您需要将此代码添加到 您的“settings.py”:

CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']