2

私は Express と Connect を使用するのが初めてなので、単純な解決策を持つ愚かなことをしていることを願っています...

基本的に、ユーザーがペルソナを使用してログインするページがあります。認証試行を検証するには、express-personaを使用します。おそらく、このモジュールは、ユーザーの検証済みの電子メール アドレスをセッション変数 (デフォルトでは req.session.email) に保存します。

これで、ユーザーはログイン後にコメントを投稿できます。このコメントは、ユーザーがログインしたメール アドレスと共に保存されます。フォームを提供するサーバーが、コメントの投稿を処理するサーバーと同じ場合、これはうまくいきます。ただし、それらが異なる場合 (たとえば、ユーザーが でフォームに入力しhttp://localhost:8001、ブラウザがコメントを保存する POST 要求を送信するとしますhttp://localhost:8000)、突然 req.session.email の値が になりundefinedます。

Cross-Origin Resource Sharing を正しくセットアップしたと思います。フォームは次のように送信されます (jQuery を使用):

$.ajax('http://localhost:8000/post/comment',
       {
           data: {comment: $('#commentField').val()},
           type: 'POST',
           xhrFields: {withCredentials: true}
       }
);

(注意してくださいxhrField: {withCredentials: true}-- セッション Cookie が渡されます。これは、ネットワーク リクエストを調べて確認しました。)

サーバーは(私が思うに)正しい CORS ヘッダーを設定します。

res.header('Access-Control-Allow-Origin', 'http://localhost:8001');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
res.header('Access-Control-Allow-Credentials', 'true');

を追加すると、POST リクエストと一緒に送信されたものと同じ値を持つ Cookie が表示されますconsole.log(req.cookie)sessionId

ただし 、クロスオリジンリクエストの場合はconsole.log(req.session.email)表示されます-繰り返しますが、リクエストが同じオリジンから来た場合は正常に機能します。undefined

私は何を間違っていますか?

4

2 に答える 2