从浏览器中删除应用程序 cookie 后调用重定向失败,提示 cors 错误

Posted

技术标签:

【中文标题】从浏览器中删除应用程序 cookie 后调用重定向失败,提示 cors 错误【英文标题】:redirection fails when called after deleting application cookies from the browser says cors error 【发布时间】:2020-05-12 04:04:45 【问题描述】:

在我的 django 应用程序中,HttpResponseRedirection 失败 当我第一次这样做时,它会通过并重定向。

if request.user.is_anonymous:
    request.session.flush()
    print(request.get_host())
    sso_auth_url = 'https://' + request.get_host().split(',')[0] + reverse('dcmsisso:auth')
    windows_auth_url = os.path.join(API_BASE_URL, 'api', API_VERSION, 'windows/auth')
    redirect_url = windows_auth_url + '?redirecturl=' + sso_auth_url + '?next=' + next_url
    return HttpResponseRedirect(redirect_url)

当我在某个页面并删除所有会话 cookie 时,尝试重新加载它进入此块的页面并且不调用下一个函数。 但是,如果我左键单击失败的 url 并在新页面中打开它,那么它会重定向到主页。 从 3 天开始,我一直在尝试解决此错误。任何人都可以建议。 我可以提供更多信息,我不知道缺少什么。

编辑:我收到以下错误:

Access to XMLHttpRequest at 'https://iamws-xxx.com/api/v1/windows/auth?redirecturl=https://dcms.yyy.com/dcmsisso/auth?next=/home' (redirected from 'https://dcms.yyy.com/getUser') from origin 'https://dcms.yyy.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

在我的 settings.py 中:

MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'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',
]


CORS_ORIGIN_WHITELIST = [
"https://iamws.xxx.com",
"https://dcms.yyy.com"
]
CSRF_TRUSTED_ORIGINS = [
'iamws-xxx.com',
]

CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS=True

CORS_ALLOW_HEADERS = [
'Access-Control-Allow-Origin',
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'content-type',
'Pragma',
'Expires',
'Cache-Control',
]

我还在已安装的应用程序中添加了 cors-headers 并在中间件中进行了更改。

【问题讨论】:

【参考方案1】:

我在这里假设您已经摆脱了重定向问题并且 您在访问 API 时正在调试 cors 错误 - 在那 在这种情况下,您可能需要更新问题标题。

对于未来的读者 - 在调试任何与 cors 相关的问题之前,请确保您在 settings.py 文件中以正确的顺序配置了导入。

CorsMiddleware 应该放在尽可能高的位置,尤其是在任何可以生成响应的中间件之前,例如 Django 的 CommonMiddleware 或 Whitenoise 的 WhiteNoiseMiddleware。如果不是之前,它将无法将 CORS 标头添加到这些响应中。 -

引用于pypi.org


开始调查

使用浏览器的开发者工具,调查网络标签。

不太确定,如果您分享的错误文本来自终端、日志或网络选项卡。

在您的网络选项卡中选择失败的请求,然后检查请求的标头、预览和响应。

它应该可以帮助您了解实际请求的是哪个 cors 标头,以及您是否在 settings.py 下的 CORS_ALLOW_HEADERS = [...] 下包含了相同的标头


重定向后遇到 CORS 策略阻塞!

我只能理解您的重定向逻辑的一部分,但您似乎正在使用 IAM 进行某种 LDAP 身份验证或 OAuth。在任何情况下,您都可能希望确保您在已连接系统的允许且适当分配的 CORS 策略范围内工作。


一切顺利!

【讨论】:

嗨,非常感谢您的回复。我做了你建议的改变。并编辑帖子。这是一种 LDAP 身份验证,当您第一次从特定 api 执行此操作时,我会通过,但从另一个 api 调用时会失败。 错误是从浏览器控制台复制的 如果其他应用程序不在生产中,那么您可以更新其settings.py 文件以允许CORS_ORIGIN_WHITELIST 中的所有域,或者简单地将CORS_ORIGIN_ALLOW_ALL 设置为True。这将帮助您验证这是否确实是一个多源问题。如果您可以确定这一事实,那么您可以相应地为您的 cors 来源设置安全性。

以上是关于从浏览器中删除应用程序 cookie 后调用重定向失败,提示 cors 错误的主要内容,如果未能解决你的问题,请参考以下文章

重定向后 Cookie 消失

在页面刷新之前从 URL 中删除查询字符串

注销和删除 Cookies [重定向到主页]

MVC 身份验证超时/会话 cookie 删除后的 Ajax 请求

用js代码 window.location.href 重定向后,如何通过浏览器返回定向之前的页面?

发送重定向时强制浏览器从 URL 中删除#hash