javascript - 如何使用带有 JQuery 的书签来发送 403 身份验证 header 作为跨域请求 (CORS)?

标签 javascript jquery authentication http-status-code-401 cors

所以我有一个在其他网站上执行 JavaScript 的书签,我想在其上的缓存按钮被触发时触发 403 Authentication required header 点击。这样,就会出现提示,要求他们登录。

clickrobot on the apple website

问题是我不打算为我发出的ajax请求提供身份验证 header ,同时将 Access-Control-Allow-Origin: 设置为具有 的任何域>* 值。我应该明确定义我想要允许 403 身份验证 header 出现在哪个域上,但我不能。

这是我的代码。

.htaccess

header set Access-Control-Allow-Origin: *
#header set Access-Control-Allow-Methods: GET, POST, PUT, DELETE
header set Access-Control-Allow-Headers: Authorization

JQuery

$.ajax({
            headers : {
                "Authorization" : "Basic TVNF3TQtU1BGMjAx6C12bVxzbW4ydHBvaW50OlF3Z5J0eSEyM6Q1"
            },
            type: "GET",
            url: 'http://desbest.uk.to/clickrobot/favicon.png', //image for testing
            crossDomain:true,
            xhrFields: {
                withCredentials: true
            }, 
            //contentType: "application/json; charset=utf-8",
            //dataType: "json",
            success: function(data) {
                alert('ok!');
                //formatData(format_type,data);
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert(textStatus + ' / ' + errorThrown);
            }
        }); 

我收到的错误

Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.

我见过 Diigo 书签可以做到这一点,所以这是可能的,但是如何实现呢?这可能吗?

最佳答案

让我们看一下documentation 。有两点需要注意:

...the browser will reject any response that does not have the Access-Control-Allow-Credentials: true header...

Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding.

您应该返回的 header 是:

Access-Control-Allow-Origin: [some_origin]
Access-Control-Allow-Credentials: true 

您可以通过使用服务器脚本获取 Referer 来返回第一个 header ,从 Referer 中检索源,然后使用脚本返回 header 。在 PHP 中,我们可以按如下方式执行此操作:

$urllist = parse_url($_SERVER['HTTP_REFERER']);
$origin = $urllist['scheme'] . '://' . $urllist['host'];
header("Access-Control-Allow-Origin: " . $origin);

更新: 您应该阅读Access-Control-Allow-Origin Multiple Origin Domains ,特别是这个answer 。如果您可以访问 httpd.conf,您可能不需要 PHP 文件

无论如何,您的 url 不应该是图像,而应该是 PHP 脚本的 url。

url: 'http://desbest.uk.to/clickrobot/somescript.php'

在您的 php 脚本中,您检索请求的来源(这将是小书 checkout 现的页面。然后您可以输出带有来源的 header 。无论小书 checkout 现在何处,它都应该始终与正确的标题。

即使您指定了正确的 header ,我也不完全确定授权对话框是否会使用 Ajax 弹出。因此,这就是为什么我们将在下面看看 Diigo。


Diigo 使用不同的方法,即:单击“登录”后,JSONP用于请求由服务器上的服务器端脚本(例如 PHP)生成的 javascript 文件。 JSONP 是 CORS 的替代方案。来自不同地方的 JavaScript 文件可以包含在页面的 header 中,完全没有问题,这与 Ajax 请求不同。

如果用户未登录,请求 javascript 文件会发送一个 401 header ,其中显示“身份验证”对话框(这是服务器端脚本中的 coded!)。用户输入他/她的详细信息,并根据输入的信息返回 javascript 文件的内容。如果用户成功登录,它可能会返回类似 callback({signedin : 1}) 的内容,否则返回 callback({signedin : 0})

现在调用带有某些参数的 javascript 函数回调。如果用户已登录,我们将显示小书签的内容。


在 htaccess 中放入什么: 未经测试,但您希望允许所有来源并将“Access-Control-Allow-Origin” header 设置为来源的值。我相信这应该可以解决问题:

SetEnvIf Origin "^(.*)$" ORIGIN_DOMAIN=$1
Header set Access-Control-Allow-Origin "%{ORIGIN_DOMAIN}e" env=ORIGIN_DOMAIN

关于javascript - 如何使用带有 JQuery 的书签来发送 403 身份验证 header 作为跨域请求 (CORS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10366326/

相关文章:

asp.net - SignalR:如何强制身份验证/终止集线器连接服务器端

rest - 角度 6 woocommerce REST 身份验证

javascript - 回调值中的 Angular 2 函数不更新 View

javascript - JavaScript 正则表达式模式中变量的一个奇怪问题

javascript - 如何更换 带空字符串

javascript - 在与对象 react 时在 child 之间共享状态

jquery - DatePicker清除功能

javascript - 将 CSS 转换属性更改为顶级属性的最佳方法?

javascript - HTML DIV 位于 DIV 之上的 DIV 内

php - 客户无法在 Safari 中登录 Magento