25

認証用の Passport モジュールを備えた nodejs Express REST API があります。ログイン メソッド (GET) は、ヘッダーで Cookie を返します。Chrome から呼び出すと、正常に動作し、ブラウザに Cookie が設定されます。

しかし、Angularjs から $http を介して呼び出すと、Cookie が設定されません。

Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly

上記でわかるように、Set-Cookie は http サービス応答のヘッダーに存在します。

おそらく HttpOnly がこの問題の原因ではないでしょうか? はいの場合、どうすれば変更できますか? ここに私のエクスプレス設定があります:

app.configure(function () {
    app.use(allowCrossDomain);
    app.use(express.bodyParser());
    app.use(express.cookieParser())
    app.use(express.session({ secret: 'this is a secret' }));
    app.use(flash());
    //passport init
    app.use(passport.initialize());
    app.use(passport.session());
    app.set('port', process.env.PORT || 8080);
});

ご協力ありがとうございました

4

5 に答える 5

19

資格情報を使用するように $http 要求を構成してください。XHR ドキュメントから:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

XMLHttpRequest と Access Control の両方によって公開される最も興味深い機能は、HTTP Cookie と HTTP 認証情報を認識する「認証済み」リクエストを作成する機能です。デフォルトでは、クロスサイト XMLHttpRequest 呼び出しでは、ブラウザーは資格情報を送信しません。XMLHttpRequest オブジェクトを呼び出すときに、特定のフラグを設定する必要があります。

options オブジェクトを使用して、資格情報の使用を設定できます。

http://docs.angularjs.org/api/ng.$http

例:

$http({withCredentials: true, ...}).get(...)
于 2013-10-15T14:55:07.090 に答える
5

クッキーの存在をどのように確認していますか?

$http$.ajaxjQueryやその仲間と同様に、ブラウザの XHR の単なるラッパーです。これは、ブラウザが Cookie を正常に処理することを意味します。

私の推測では、Cookie設定されていますが、それを読み取ろうとしていますdocument.cookieHttpOnlyスクリプトが Cookie にアクセスできないようにします。 これは良いことです。

HttpOnlyXSS 攻撃の軽減に役立ちます。これにより、悪意のあるスクリプトがユーザーのセッション トークン (およびログイン) を盗むことができなくなります。 オフにしないでくださいHttpOnly

とにかく、Cookie は必要ありません。$httpは XHR の単なるラッパーであるため、次にリクエストを行うと、ブラウザーは自動的に Cookie を送信します。これは、開発者ツールのネットワーク パネルでリクエストを確認することで確認できます。

于 2013-10-15T14:46:40.177 に答える
5

{withCredential : true}angular$httpリクエストを設定し、次のように設定することで問題を解決しました:

res.header("Access-Control-Allow-Credentials", true);

私のエクスプレスサーバー構成で。これにより、ブラウザの Cookie リストに Cookie が適切に表示されます。

于 2013-10-16T06:28:40.903 に答える
0

次のように構成することで変更できますexpress.session

app.use(express.session({
  secret : 'this is a secret',
  cookie : {
    httpOnly : false,
    maxAge   : XXX // see text
  }
});

しかし、Angular は Cookie をあまり気にしないと思います。Cookie はブラウザーによって処理されます (そして、@josh3736 に同意してくださいhttpOnly) true

Cookie が (ブラウザ) セッション Cookie であることに関係している可能性があります。maxAgeCookie にa を明示的に (ミリ秒単位で) 設定することで、より適切に機能するかどうかを試すことができます。

于 2013-10-15T14:46:48.157 に答える