【问题标题】:Pass cookie as part of node.js request将 cookie 作为 node.js 请求的一部分传递
【发布时间】:2016-04-23 22:18:59
【问题描述】:

我正在使用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”

有人可以帮忙吗?

提前致谢!

【问题讨论】:

  • 您将有更多关于您要发送的 cookie 的解释?最终用户的 cookie 存储在他们的浏览器中,并与特定浏览器和特定域唯一相关联,并与从浏览器到该域的任何请求一起发送到该域。请描述您所询问的 cookie。如果 cookie 与您的服务器所在的域不同,那么您的服务器将无法访问该 cookie。
  • @jfriend00 - 我更新了我的问题。谢谢!
  • cookie 是在哪个域和端口上创建的?您的服务器在哪个域和端口上?
  • @jfriend00 域和端口分别是 localhost:3000。我用我尝试过的解决方案更新了我的问题..
  • 运行问题中代码的服务器是什么域和端口。这很重要,因为浏览器将 cookie 与特定服务器相关联,并以这种方式保护 cookie。我正在尝试找出 cookie 属于哪个服务器,以及您尝试在哪个服务器上获取 cookie 以便您可以发送它?

标签: javascript node.js cookies request


【解决方案1】:

让我解释一下 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 代码。你展示了一个 node.js 代码块,它试图访问同一个 http://localhost:3000 服务器。但是,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

【讨论】:

  • 对,但我的第一行代码包含 cookie。所以从技术上讲,我已经有了 cookie,我正试图将其作为 request 函数的一部分传递。
  • @user1547174 - 如果您确实有正确的 cookie,那么您可以将其作为标题添加到您正在发送的请求中,正如我现在在答案末尾显示的那样。
  • 后来我发现了。非常感谢!!
【解决方案2】:

答案:

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);

【讨论】:

  • 这行得通吗?也许添加一些文字来解释为什么它与 OP 不同
  • 比如什么是parseCookie?
  • 可以是“cookie-parser”NPM模块。例如:router.use(require("cookie-parser")())。然后你在你的 express.js 处理程序中得到这个属性req.cookies
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多