web-dev-qa-db-ja.com

node.jsリクエストの一部としてCookieを渡す

requestパッケージを使用して、サーバー側のリクエストを作成しています。すべてのリクエストのCookie /セッションIDをチェックする認証ミドルウェアを作成しました。したがって、リクエストの一部としてユーザーのCookieを含める方法はありますか?ここに私の現在のコードがあります:

var cookie = parseCookie.parseCookie(req.headers.cookie);

request('http://localhost:3000/users/api', function(error, response, body) {
    console.log(body); //this console.logs my login page since requests w/o valid cookies get redirected to login
    res.render('../views/admin');
});

現在、これはコンソールに「Cookieが見つかりません」を返します。ただし、認証ミドルウェアをオフにすると、上記のコードは意図したとおりに機能します。

追加情報:

必要なCookieは、ブラウザーにあるエンドユーザーのCookieです。エンドユーザーのCookieは、ユーザーがログインするたびにアプリによって作成されます。

更新-ソリューションの試行1:

私はドキュメントからこれを試しました:

var cookie = parseCookie.parseCookie(req.headers.cookie);
var cookieText = 'sid='+cookie;
var j = request.jar();
        var cookie = request.cookie(cookieText);
        var url = 'http://localhost:3000/users/api';
        j.setCookie(cookie, url);
        request({url: url, jar: j}, function(error, response, body) {
            request('http://localhost:3000/users/api');
        });

ただし、コンソールはまだ「Cookieが見つかりません」を返しています

誰か助けてもらえますか?

前もって感謝します!

12
Trung Tran

Cookieについて説明します。これは、おそらく、必要なCookieを取得することが難しい理由を示しています。

  1. ユーザーのブラウザがhttp://localhost:3000にログインすると、そのサーバーはログインCookieを作成し、ログインレスポンスの一部としてそれを返します。
  2. ブラウザーはそのCookieを受信すると、そのCookieをブラウザー内に永続的に保存し、そのCookieをhttp://localhost:3000ドメインとポートに関連付けます。
  3. ユーザーがhttp://localhost:3000に再度リクエストを行うと、ブラウザはその特定のドメインとポート用に以前に保存したすべてのCookieをサーバーにリクエストとともに送信します。
  4. サーバーは、リクエストを受信すると、リクエストとともに送信されるすべてのCookieを検査できます。
  5. その後、ブラウザが別のサーバーまたは同じサーバーでさえ別のポートにリクエストを行うと、それらのCookieは別のサーバーとポートに属するため、ブラウザーはそのリクエストで以前に保存されたCookieを送信しません。ブラウザーは、Cookieが属するサーバーにのみCookieを送信するために、非常に長いセキュリティを備えています。 Cookieは多くの場合ログインアクセスを提供するため、ログイン資格情報Cookieなどを送信してはならないサーバーに送信しないことが重要である理由を明確に確認できます。

次に、node.jsコードに進みます。同じhttp://localhost:3000サーバーにアクセスしようとしているnode.jsコードのブロックを表示します。ただし、Cookieはユーザーのブラウザーに保存されます。 node.jsコードは、ブラウザがそれらを保護するため、ブラウザから取得できず、ブラウザ自体がhttp://localhost:3000にリクエストを送信したときにのみ表示されます。


実際にnode.jsコードに正しいCookieがある場合は、リクエストで次のように設定できます。

request({url: 'http://localhost:3000/users/api', headers: {Cookie: somedataHere}}, function(error, response, body) {
    console.log(body); //this console.logs my login page since requests w/o valid cookies get redirected to login
    res.render('../views/admin');
});

requestモジュールのカスタムヘッダーの関連ドキュメントは here です。

20
jfriend00

回答:

var cookie = parseCookie.parseCookie(req.headers.cookie);
var cookieText = 'sid='+cookie;
var options = {
  url: 'https://api.github.com/repos/request/request',
  headers: {
   'User-Agent': 'request'.
   'Host': 'localhost:3000',
   'cookie': cookieText //this is where you set custom cookies
  }
};

function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    var info = JSON.parse(body);
    console.log(info.stargazers_count + " Stars");
    console.log(info.forks_count + " Forks");
  }
}

request(options, callback);
6
Trung Tran