web-dev-qa-db-ja.com

CORSXHRを使用しているときにブラウザがCookieを返送しない

編集-Chrome Webインスペクターを使用してCookieを確認すると、Cookieの有効期限の値に関係なく、ブラウザーはCookieをセッションCookieとして設定し、リクエストごとに削除するようです。

Node.jsとExpressを使用して、教えているクラスのCORSサンプルを作成しています。

ただし、Cookieはサーバーから設定されていますが、次の要求でサーバーに返送されていません。これは、些細なセッションマネージャを使用できないことを意味します。

私がここで何を見逃しているのか分かりますか?ドメインによって設定されたCookieをブラウザがそのドメインに返送しないのはなぜですか?これは自動的に行われるべきではありませんか?

編集-いくつかのコード例:XHRリクエストの設定:

var xhr = new XMLHttpRequest();

xhr.open(method, url, true);
xhr.widthCredentials = true;

xhr.onreadystatechange = function(res){
    if (xhr.readyState == 4){
        cb(res,xhr);
    }
};

xhr.setRequestHeader("Content-Type",'application/json');

xhr.setRequestHeader('Accept','application/json');

xhr.send(JSON.encode({param:some_param})); 

サーバ:

function allowCrossDomain(req,res,next) {  
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.Origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type,Accept,X-Requested-With');

    if (req.method!='OPTIONS') return next();

    res.send(204);
}                 

//while configuring express
app.use(allowCrossDomain)

観察可能な違いなしに同じことを行うさまざまなnpmミドルウェアを試したことも言及する価値があります

シナリオに関して:

  1. XHRを使用してCORSリクエストを作成する
  2. サーバーはCookieを設定します。これは、クライアントに正常に返送されます(エクスプレスセッションCookie)。
  3. 次のXHRリクエストはそのCookieをサーバーに送り返さないため、expressはユーザーを識別できず、新しいセッションCookieなどを作成します。
22
AriehGlazer

私はこれについて読んだこと以外は何も知りませんが、 MDN docs によると、XHRオブジェクトに「withCredentials」プロパティがあり、これを設定する必要があります。

xhr.withCredentials = true;

デフォルトでは、falseです。そのフラグが設定されていない場合、Cookieは送信されず、応答のCookieヘッダーは無視されます。

edit—私はあなたの質問を数回読んだことを誓いますが、私はあなたの旗についての言及を完全に見逃しました。ごめんなさい。ただし、これは完全な無駄ではないため、サーバーで応答ヘッダーの「Access-Control-Allow-Credentials」フラグをtrueに設定する必要があることにも言及します。 -Control-Allow-Origin」を現在のプロトコル+ホスト+ポートに設定します。

27
Pointy

これ 私に起こった 前に、そして私はそれがかなり愚かであると言うことができます。

仮想マシンを使用している場合は、通常、必要なときにいつでも仮想マシンを一時停止/再開します。

これは、仮想マシンの日付が、ホストまたは使用しているクライアントと比較して、通常、数日(またはそれ以上)遅れていることを意味します。

したがって、サーバーがCookieの有効期限の日付(通常は現在の日付から数時間後)を設定すると、クライアントではすでに有効期限が切れています。したがって、クライアントはそれを保持しません。

仮想マシンで日付を更新するには、ntpdateを使用するか、手動で日付を設定して、それが問題かどうかを確認することをお勧めします。

# what's the date?
date
# You'll see if it's the problem already

# If it is, here is how to manually set it
date -set 2012-07-22 # yyyy-mm-dd
date -set 17:00:42 # hh:mm:ss
5

私はちょうどこの問題を抱えていました、私の場合の解決策はクッキーへのパスを追加することでした、それでクッキーを追加するときあなたは使用しなければなりません:

document.cookie = 'cookieName=cookieValue;path=/';

このようにして、ブラウザは新しいリクエストでCookieを送信できるようになります。

PS:クロスドメインリクエストを使用している場合は、xhr.withCredentials = true;も必要です。

2
H. J. Rhenals

同様の問題が発生し、ブラウザの設定がサードパーティのCookieをブロックしていることが判明しました(Chrome>設定>詳細設定>プライバシー>コンテンツ設定>サードパーティのCookieとサイトデータをブロックする)。ブロックを解除すると問題が解決しました。