2

そのため、他のWebサイトでjavascriptを実行するブックマークレットを持っています。これは、キャッシュボタンがクリックされると、403 Authentication Requiredヘッダーをトリガーしたいと考えています。そうすれば、ログインを求めるプロンプトが表示されます。

Apple Web サイトのクリックロボット

Access-Control-Allow-Origin:問題は、値を持つ任意のドメインに設定している間、作成している ajax 要求に認証ヘッダーを提供するつもりがないことです*。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);
            }
        }); 

私が得るエラー

credentials フラグが true の場合、Access-Control-Allow-Origin でワイルドカードを使用できません。

Diigo ブックマークレットがそれを行うのを見たことがあるので、それは可能ですが、どうすればよいでしょうか? それはまったく可能ですか?

4

1 に答える 1

5

ドキュメントを見てみましょう。注意すべき点が 2 つあります。

...ブラウザは 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 ファイルは必要ないかもしれません。

とにかく、URL は画像ではなく、PHP スクリプトの URL にする必要があります。

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 に答える