将cookie作为node.js请求的一部分传递

Tru*_*ran 12 javascript cookies request node.js

我正在使用该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');
});
Run Code Online (Sandbox Code Playgroud)

目前,这会在控制台中返回"找不到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');
        });
Run Code Online (Sandbox Code Playgroud)

但是,控制台仍然返回'找不到cookie'

有人可以帮忙吗?

提前致谢!

jfr*_*d00 20

让我解释一下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');
});
Run Code Online (Sandbox Code Playgroud)

此处提供request模块中自定义标头的相关文档.


Tru*_*ran 5

回答:

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);
Run Code Online (Sandbox Code Playgroud)