ccr*_*ccr 8 django django-csrf cors django-rest-framework ibm-cloud
我正在开发一个应用程序,前端是一个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
Run Code Online (Sandbox Code Playgroud)
我在从前端API向后端API发出请求时遇到问题.错误是这样的:
Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.
Run Code Online (Sandbox Code Playgroud)
我正在使用CORS,我已经在Django后端API的settings.py中包含以下行:
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',
)
Run Code Online (Sandbox Code Playgroud)
谁知道如何解决这个问题?
sol*_*oke 26
您的CSRF_TRUSTED_ORIGINS
设置错误 - 将其更改为:
CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']
Run Code Online (Sandbox Code Playgroud)
该设置仅需要主机名,而不是方案.无论如何,方案是多余的,因为该设置仅在通过HTTPS连接时有任何影响.
你可能还需要把东西放进ALLOWED_HOSTS
......
小智 16
如果您运行的是 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
小智 13
我也面临这个问题。确保域名不包含尾部斜杠。代替
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']
Run Code Online (Sandbox Code Playgroud)
将其更改为
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
Run Code Online (Sandbox Code Playgroud)
对于遵循此规则的任何人,如果您将设置CORS_ORIGIN_ALLOW_ALL
为True
,则您不再需要设置CORS_ORIGIN_WHITELIST
变量,因为您已经允许所有主机。
解决我的问题-可能对某人有帮助
问题是一个特殊的问题,我们有一个客户端应用程序使用TokenAuthentication将请求发送到另一个应用程序,一个使用Django Admin构建的CRM,因此使用了SessionAuthentication。当我们打开Django Admin应用程序时,SessionMiddleware会自动为该域创建一个session_id cookie。当打开客户端应用程序并尝试执行请求时,我们收到以下错误:
Error: CSRF Failed: Referer checking failed - https://domainofthedjangoadminapp.com does not match any trusted origins.
Run Code Online (Sandbox Code Playgroud)
那只是因为在浏览器中已经设置了session_id cookie,因此,使用SessionAuthentication而不是TokenAuthentication发出了请求,并且失败了。
删除cookie显然可以解决问题。
小智 5
根据这个文档。https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes
通过以下方式安装 cors-header:
pip install django-cors-headers
将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',
]
Run Code Online (Sandbox Code Playgroud)
将 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',
]
Run Code Online (Sandbox Code Playgroud)
4 设置原点
CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您的django 版本是“4.xx”:
python -m django --version
// 4.x.x
Run Code Online (Sandbox Code Playgroud)
那么如果报错如下图:
来源检查失败 - https://example.com 与任何可信来源不匹配。
将以下代码添加到“settings.py”:
python -m django --version
// 4.x.x
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您遇到了与上面类似的错误:
错误:CSRF 失败:引用检查失败 - https://front.bluemix.net与任何可信来源不匹配。
因此,您需要将此代码添加到您的“settings.py”中:
CSRF_TRUSTED_ORIGINS = ['https://example.com']
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7109 次 |
最近记录: |