2

所以我有一个在其他网站上执行 javascript 的小书签,一旦点击了它上面的缓存按钮,我想触发一个403 Authentication Required标题。这样,会出现一个提示,要求他们登录。

苹果网站上的clickrobot

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

这是我的代码。

.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);
            }
        }); 

我得到的错误

当凭证标志为真时,不能在 Access-Control-Allow-Origin 中使用通配符。

我已经看到 Diigo 小书签做到了,所以这是可能的,但是怎么做呢?有可能吗?

4

1 回答 1

5

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

...浏览器将拒绝任何没有 Access-Control-Allow-Credentials: true 标头的响应...

重要提示:在响应凭据请求时,服务器必须指定域,并且不能使用通配符。

您应该返回的标题是:

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

您可以通过使用服务器脚本获取Referer 来返回第一个标头,从Referer 检索来源,然后将标头与您的脚本一起返回。在 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,尤其是这个答案。如果您可以访问 httpd.conf,您可能不需要 PHP 文件

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

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

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

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


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

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

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


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

SetEnvIf Origin "^(.*)$" ORIGIN_DOMAIN=$1
Header set Access-Control-Allow-Origin "%{ORIGIN_DOMAIN}e" env=ORIGIN_DOMAIN
于 2012-05-01T18:00:21.207 回答