为啥我的 CORS 请求因 http 401 错误而失败

Posted

技术标签:

【中文标题】为啥我的 CORS 请求因 http 401 错误而失败【英文标题】:Why does my CORS request fail with http 401 error为什么我的 CORS 请求因 http 401 错误而失败 【发布时间】:2020-03-28 20:32:22 【问题描述】:

我正在使用 javascript 中的 Fetch API 从跨域 apache 服务器(由我控制)获取图像,但出现以下错误:

SEC7120:[CORS] 源“http://origin.com”在跨域资源 cross-origin.com/....jpg 的 Access-Control-Allow-Origin 响应标头中找不到“http://origin.com”

HTTP401: DENIED - 请求的资源需要用户身份验证。 (Fetch)GET cross-origin.com/….jpg

以下是创建请求对象以获取 jpg 的 javascript:

var authb64 = btoa(\'' . $xrefrec['ftp_username'] . ':' .                                   $xrefrec['ftp_password'] . '\');
const request = new Request(document.getElementById(thm.photo_id).href,
                                \'Access-Control-Request-Headers\': \'Authorization\',
                                \'Options\': \'* HTTP/1.1\',
                                \'Authorization\': \'Basic \' + authb64,
                                \'Origin\': \'http://origin.com\',
                                \'Credentials\': \'include\',
                                \'Cache\': \'no-cache\',
                                \'Mode\': \'cors\',
                                \'Method\': \'GET\'
                            );

代码创建一个锚标记,将请求传递给 fetch(),然后等待 Promise 解析。

在服务器上,我在图片所在的目录下设置了一个 .htaccess 文件,如下:

AuthName "Client Only"
AuthType Basic
AuthBasicProvider dbm
AuthDBMUserFile "C:/Bitnami/wampstack-7.3.11-0/apps/.../conf/.htdbm-users"
Require user (valid user id)
RewriteRule ^/(clientgalleries).*$/ $1 
Header set Access-Control-Allow-Methods "GET,OPTIONS"
Header set Access-Control-Allow-Credentials "true"
Header set Cache-Control no-cache
Header set Access-Control-Allow-Headers "Authorization,Access-Control-Allow-Origin"
Header set WWW-Authenticate: Basic
Header set Access-Control-Allow-Origin "http://origin.com"

【问题讨论】:

如果有人能帮我解决这个问题,我们将不胜感激。 【参考方案1】:

如果我理解正确,您正在尝试从未知域(您尚未共享它 - 没关系)向 origin.com 发出 CORS 请求。这是正确的吗?

您的 JavaScript 代码无法更改 Origin 标头。例如,如果您有来自 A.com 的 javascript 请求来自 B.com 的图像,则 B.com 必须在其 Access-Control-Allow-Origin 标头中允许 A.com

【讨论】:

不,我正在从 origin.com 向 cross-origin.com 发出 cors 请求。 我应该补充一点,对 fetch() 的调用会引发异常,从而导致 401 错误。 然后反转域; cross-origin.com 必须在其 CORS 预检响应中使用适当的 Origin 白名单进行响应。 401 错误表明这不是 CORS,因为 CORS 是浏览器错误,不允许您发出 CORS 请求。 我可能没有说得很清楚,但是根据上面 .htaccess 中的最后一行,它是使用 Access-Control-Allow-Origin 标头响应的跨域服务器。跨度>

以上是关于为啥我的 CORS 请求因 http 401 错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

前端在 CORS 请求中从后端获取错误 401 - apache/php 配置不足?

CORS 预检请求返回带有 Windows 身份验证的 HTTP 401

带有 basicauth 的 Ajax CORS 请求在浏览器上出现 401 错误

Yii2 和 reactjs CORS 过滤器给出错误:预检响应具有无效的 HTTP 状态代码 401

.net 核心允许在使用 CORS 时发回错误 401(而不是零)

请求因HTTP状态401失败:Unauthorized 的原因?