10

Spring MVC を使用して REST API バックエンドを構築し、Spring Security を使用して基本認証で保護しました。

Javascript クライアントから REST API へのクロス ドメイン ajax 呼び出しを実行したいと考えています。GET 呼び出しに制限されたくないので、JSONP を使用したくありません。私は CORS を使用しており、サーバー側に適切なヘッダーを配置しています。

私の REST API がドメイン localhost:8087 にあり、私のクライアントが localhost:8086 にあるとします。これはクロス ドメイン コールです。

私のJavascriptクライアントでは、jQueryでajax呼び出しを行います:

<script>
        $.ajax ({
            url: "http://localhost:8087/SpringMVC/users/user1",
            beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", "Basic xxxxxxxxxxxx"); },
            success: function(val) { console.log(val); alert("success" + val); },
            error: function(val) { console.log(val); alert("error" + val); }
        });
</script>

私の問題は、jQuery が HTTP 要求で Authorization ヘッダーを送信しないことです。その理由はわかりません。beforeSendメソッドでやるからわからないので、HTTPリクエスト内にあるはずです。結果: 401 エラーが発生しました。

クロスドメインではない同じドメイン localhost:8087 からスクリプトを試すと、問題はありません。

どのように可能ですか?

私のスクリプトは単なるテストです。ユーザー名/パスワードをクライアント側に置くつもりはありません。しかし、認証で保護された基本的な REST API に対して ajax 呼び出しを行う方法をテストしたいと考えています。ユーザー名/パスワードを安全にするためにサーバー側で送信する必要があると思います。REST API は Cookie を返します。REST API への次の ajax 呼び出しでユーザー名/パスワードを渡す必要はもうありません。私は正しいですか?

Chrome Advanced REST クライアントで REST API をテストしましたが、そのように動作しています。最初のリクエストでは、認証ヘッダーを渡す必要があります。それなら必要ありません。私のjavascript Webクライアントでもそのように動作するはずですか? Node.JS と Backbone を使用してビルドするつもりです。

どうもありがとう。

EDIT2:本当にCORSブラウザの問題のようです。サーバー側でOPTIONSメソッドのヘッダーAccess-Control-Allow-Methodsを追加しましたが、Chromeで動作します。もうエラーなしで JSON 応答にアクセスできます。しかし、次のリクエストには認証ヘッダーを使用する必要があります。送信されたCookieを使用するようjQueryに指示する方法は?

そして、Firefox 11を試してみると、json応答にアクセスできず、エラーが発生しました:

"NetworkError: 401 Non-Autorisé - http://localhost:8087/SpringMVC/users/user1"
4

2 に答える 2

8

どうやら、Chrome と Firefox ではクロス ドメイン リクエストの扱いが少し異なるようです。クロス ドメイン リクエストを実行する前に、HTTP OPTIONS メソッドを使用して「プリフライト」リクエストと呼ばれるものを実行します。Chrome と Firefox の違いは、Chrome は認証情報とともに Authorization ヘッダーも送信するのに対し、Firefox は送信しないことです。

その後、Spring Security の構成の問題が残ります。私の URL /users/* は、OPTIONS を含むすべての HTTP メソッドに対して保護されています。Firefox の場合、Authorization ヘッダーが送信されないため、私の要求は承認されません。安全な URL /users/* を GET メソッドのみに制限すると、Firefox で完全に機能します。したがって、Spring セキュリティ構成にそれのみを追加する必要がありました。

<intercept-url pattern="/users/*" access="isAuthenticated()" method="GET"/>

その後、私には選択肢があります: OPTIONS を除いて、intercept-url で保護される他のメソッドを追加するか、Spring MVC コントローラーで HTTP メソッド呼び出しを GET に制限することができます。 Javadoc。私は2番目の解決策を選びました。しかし、Chrome のように Firefox に資格情報を強制的に送信させる解決策を誰かが見つけたら、それは素晴らしいことであり、私はこれを選択します。

于 2012-04-09T12:32:25.243 に答える