2

我正在从我的服务器向另一台服务器发出发布请求,为此我正在使用库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 代码。

错误在“管道”函数中,因为如果我调用它,我会丢失会话,而不是在其他情况下,但我需要使用它。

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

4

3 回答 3

1

我相信 express-session 正在将它的会话保存到 cookie 中,而您正在做的是将洞响应从管道config.petitionServer + path传输到客户端,因此它会覆盖 express-session 保存的 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);
});
于 2016-02-14T21:22:50.530 回答
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);
    });
});
于 2016-10-26T16:01:50.930 回答
0

我建立了解决方案,这是我的错。

会话正在进行req.session,请愿服务器也在使用 express-session 模块。当请愿服务器收到请求时,此请求将会话变量替换为请愿服务器之一。

解决方案是从请愿服务器中删除 express-session 模块。

另一个解决方案是管理来自主机服务器的会话,防止替换它。但我没有这样做

于 2016-02-14T21:31:52.507 回答