67

クライアント側のAngularJSとサーバー側のAPI(Tomcat + Jersey for WS)用のJavaに基づくアプリケーションに取り組んでいます。

API の一部のパスが制限されています。ユーザーがセッションを持っていない場合、返される応答ステータスは 401 です。クライアント側では、401 http ステータスが傍受され、ユーザーがログイン ページにリダイレクトされます。

ユーザーが認証されたら、サーバー側でセッションを作成します

httpRequest.getSession(真);
クライアントに送信される応答には、ヘッダーに Set-cookie 命令が含まれています。

Set-Cookie:JSESSIONID=XXXXXXXXXXXXXXXXXXXXX; ドメイン=localhost; パス=/api/; HttpOnly

問題は、Cookie がクライアント側に配置されないことです。ローカルホスト ドメインの Cookie を検査すると空なので、次のリクエストのヘッダーにこの Cookie がなく、クライアント側はまだ API の制限されたパスにアクセスできませんでした。

クライアントとサーバーは同じドメインにありますが、同じパスと同じポート番号を持っていません:

クライアント :http://localhost:8000/app/index.html

サーバー:http://localhost:8080/api/restricted/

追加情報: CORS は両側で有効になっています:

「アクセス制御許可メソッド」、「GET、POST、OPTIONS」
「アクセス制御許可オリジン」、「*」
"Access-Control-Allow-Credentials", true

Set-cookie を適切に機能させるためのアイデアはありますか? それは AngularJS 関連の問題ですか?

4

6 に答える 6

21

AngularJSで、前進するのに役立つ問題を見つけました。

"Access-Control-Allow-Credentials" : trueクライアント側では設定されていないようです。指示$httpProvider.defaults.withCredentials = true は無視されました。

$resource 呼び出しを、構成パラメーターで {withCredentials:true} を使用した単純な $http 呼び出しに置き換えます。

于 2013-02-25T16:43:59.093 に答える
18

私はあなたの問題に非常によく似た問題を解決することができました。マイプレイ!バックエンドがセッション Cookie を設定しようとしましたが、これは Angular でキャッチできなかったり、ブラウザ経由で保存できませんでした。

実際、解決策にはこれとそれが少し含まれていました。

特定のドメインを Access-Control-Allow-Origin に追加し、ワイルドカードを削除することによってのみ解決できる最初の問題を解決したと仮定すると、次の手順は次のとおりです。

  1. ヘッダーから HTTP-Only を削除するSet-Cookie必要があります。そうしないと、angular コードによって「生成された」Cookie を受け取ることができなくなります。
    このセットアップは、Chrome では機能しませんが、Firefox では既に機能します。

  2. Chrome でも機能させるには、次のことを行う必要があります。

    a) WS が「ホスト」されているドメインを使用して、cookie で localhost から別のドメインを送信します。.domain.comの代わりにワイルドカードを使用することもできますws.domain.com

    b) 次に、Cookie で指定したドメインを呼び出す必要があります。そうしないと、Chrome は Cookie を保存しません。

    /api[オプション]そのパスを削除して、/


そして、それはトリックになるはずです。
いくつかの助けになったことを願っています

于 2013-10-31T10:55:56.897 に答える
9

サーバー側とクライアント側の両方で作業が必要です。

クライアント

$http次のいずれかの方法でconfigwithCredentialsを設定しtrueます。

  1. リクエストごと

    var config = {withCredentials: true};
    $http.post(url, config);
    
  2. すべてのリクエストに

    angular.module("your_module_name").config(['$httpProvider',
      function($httpProvider) {
        $httpProvider.interceptors.push(['$q',
          function($q) {
            return {
              request: function(config) {
                config.withCredentials = true;
                return config;
              }
            };
          }
        ]);
      }
    ]);
    

サーバ

応答ヘッダーAccess-Control-Allow-Credentialsを に設定しtrueます。

于 2015-06-02T17:39:02.540 に答える
8

追加のHttpOnlyは、ブラウザーがプラグインと JavaScript に Cookie を認識させてはならないことを意味します。これは、より安全なブラウジングのための最近の規則です。J_SESSIONID に使用する必要がありますが、ここでは使用しないでください。

于 2013-02-22T14:22:11.873 に答える