NodeJS请求重置会话

时间:2016-02-14 12:01:59

标签: node.js request express-session

我正在从我的服务器发送请求到另一台服务器,并且我正在使用库https://github.com/request/request

所以,我使用下一个代码:

router.post('/extern/*', function(req, res, next) {
    var path = req.params['0'];
    var input = req.body.text;
    var encript = crypto.encrypt(input);

    request.post(config.petitionServer + path).form({data: encript}).pipe(res)
});

会话在调用此帖子之前已初始化,但在执行时会重置会话。所以,在这种情况下,我从session var中丢失了csrf代码。

错误发生在'管道中。功能,因为如果我调用它会丢失会话,而不是在其他情况下,但我需要使用它。

如何在不丢失实际会话的情况下使用管道功能?

3 个答案:

答案 0 :(得分:1)

我认为快递会将它的会话保存到cookie中,你正在做的是将config.petitionServer + path的漏洞响应传递给客户端,以便覆盖快速会话保存的cookie。也许只是管道反复的身体是一个更好的主意?

router.post('/extern/*', function(req, res, next) {
var path = req.params['0'];
var input = req.body.text;
var encript = crypto.encrypt(input);

request.post({url: config.petitionServer + path, formData: {data: encript}, function(err, httpResponse, body))
    res.send(body);
});

答案 1 :(得分:1)

正如其他答案所述,您的快速会话将通过从其他服务器发送的cookie重置。

有几种方法可以解决这个问题。如果您不需要请愿服务器中的cookie,您可以在管道响应之前删除标题:

router.post('/myServerUrl', function(req, res) {
  request.post('/remoteServerUrl', { data })
    .on('response', function(response) {
      delete response.headers['set-cookie'];
    })
    .pipe(res);
});

如果您不想修改任何标头,您应该能够在响应处理程序内部处理响应以及内容类型。

router.post('/myServerUrl', function(req, res) {
  request.post('/remoteServerUrl', { data })
    .on('response', function(response) {
      res.set('Content-Type', 'image/jpeg')
      response.pipe(res);
    });
});

答案 2 :(得分:0)

我创建了解决方案,这是我的不好。

会话在req.session,请愿服务器也在使用快速会话模块。当请愿服务器收到请求时,该请求由请求服务器替换会话var。

解决方案是从请愿服务器中删除快速会话模块。

Anothe解决方案可以从主机服务器管理会话,防止替换它。但我没有这样做