3

私は2つのドメインを持っています。あるドメインから別のページを介して JSON オブジェクトにアクセスしようとしています。この問題に関して見つけたすべてを読みましたが、まだこれを理解できません。

JSON を提供するドメインには、次の設定があります。

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
Header set Access-Control-Allow-Headers "origin, authorization, accept"

他のドメインから、次のように呼び出しています。

$.ajax({
         type:'get',
         beforeSend: function(xhr) {
             var auth = // authentication; 
             xhr.setRequestHeader("Authorization", "Basic " + auth);
         }
         url:myUrl,
         dataType:'json',
         error: function(xhr, textStatus, errorThrown) { console.log(textStatus, errorThrown); }
      })

「auth」が適切に初期化されていることを知っています(ログに記録され、チェックされています)。ただし、これは機能しません。Firefox のコンソールで、リクエスト URL を取得します: ...

Request Method:
OPTIONS

Status Code:
HTTP/1.1 401 Authorization Required

beforeSend:...その部分を取り除くと、次のようになります

Request Method:
GET

Status Code:
HTTP/1.1 401 Authorization Required

ただし、JSON を提供するドメインは、JSONP も提供できます。主にアプリケーションが専用ブラウザで常に実行されるため、これを使用したくありません。この問題が心配です。さらに重要なことは、自分が行っていることの実際の何が問題なのかを知りたいということです。実際には、JSONP メモリ リークを克服するさまざまな方法 (jQuery を使用しないなど) があることを知っています。

とにかく、JSONP を使用したとき、私のコードは次のようになりました。

$.ajax({
    url:newUrl,
    dataType:'jsonp',
    jsonp:'jsonp'
}).done(function(d){console.log(d)})

これにより、次のようになります

Request Method:
GET

Status Code:
HTTP/1.1 200 OK

ユーザー名とパスワードの警告ボックスが表示された後。

JSON リクエストとは対照的に、jQuery が JSONP リクエストを処理する方法に根本的な違いはありますか? もしそうなら、どうすればこれを修正できますか?

ありがとう。

編集:これが私が見つけたものです。

基本的に、認証が必要なので、GET リクエストは Authorization ヘッダーを送信しています。ただし、これは「単純な」ヘッダーではないため、ブラウザーはプリフライト リクエスト (OPTIONS) を送信しています。ただし、このプリフライト リクエストには認証がないため、サーバーはそれを拒否していました。「解決策」は、OPTIONSリクエストが認証を必要としないようにサーバーを設定し、HTTPステータス200をサーバーに報告することでした。

参照: http://www.kinvey.com/blog/item/61-kinvey-adds-cross-origin-resource-sharing-cors

mail-archive[.com]/c-user@axis.apache.org/msg00790.html (これ以上のリンクの投稿は許可されていません)

残念ながら、「解決策」は Firefox でのみ機能し、Chrome では機能しません。Chrome は単にリクエストを赤で表示しますが、失敗した理由に関する詳細情報は提供しません。

編集 2: Chrome で修正: データを取得しようとしていたサーバーには、信頼されていないセキュリティ証明書がありました。このため、Chrome でのプリフライト リクエストは失敗しました。解決策 superuser[.com]/questions/27268/how-do-i-disable-the-warning-chrome-gives-if-a-security-certificate-is-not-trust (これ以上のリンクを投稿することは許可されていません)

4

3 に答える 3

3

まあ、しばらくして十分な担当者ができたので、この質問に答えて受け入れることもできます。

GETヘッダー付きの json リクエストをサーバーに送信しようとすると、ブラウザは最初にOPTIONリクエストを送信して、アクセスできることを確認します。残念ながら、このOPTIONリクエストでは認証を行うことはできません。つまり、 with auth を送信する場合、サーバーはauth なしGETの OPTION を許可する必要があります。これを行うと、物事が機能し始めました。

于 2013-05-18T07:54:16.813 に答える
1

ここで利用可能ないくつかの例は、アクセス制御を CORS と組み合わせる方法をさらに説明する場合があります。具体的には、資格のある GET の例です。アクセス制御では、リクエストでwithCredentialsフラグをtrueに設定し、メソッドをXMLHttpRequest処理するサーバーで次の 2 つのことを行う必要があります。OPTIONS

  1. 設定Access-Control-Allow-Credentials: true
  2. ヘッダーにワイルドカード*を使用しないでください。これは、HTTP アクセス制御 (CORS) に関するMDN ドキュメントAccess-Control-Allow-Originに従って正確にオリジンに設定する必要があります。

基本的に、OPTIONS リクエストを処理するモノは、適切なレスポンス ヘッダーを送り返す必要があるため、認証済みのリクエストを行うことができます。

あなたの質問では、あなたがやり取りしているサービスが を返していると述べましたがAccess-Control-Allow-Origin: *、これは認証済みのクロスドメイン リクエストと互換性がありません。これは具体的に原点を返す必要があります。

前述の MDN Http Access Control (CORS) ドキュメントは、サーバーがさまざまなクロス ドメイン要求にどのように応答する可能性があるかを概説しているサーバー側アクセス制御ドキュメントにもリンクしています。 OPTIONS メソッドへの応答。その例をここで見つけることができます

于 2015-06-30T14:54:52.293 に答える
0

JSON を取得する URL をブラウザに入力して、何が起こるか見てみませんか。文字通り、この別の Web サイトにアクセスするには認証が必要なだけのようです。

サイトが IE などの他のブラウザーで動作する必要がある場合は、JSONP が必要になります。セキュリティにより、クロス サイト リクエストは機能しません。ヘッダーはそれを変更しません。また、ヘッダーにセキュリティ ポリシーを追加する必要があると思います。

于 2012-06-26T00:59:13.653 に答える