Request: 在多次重定向期间丢失的 Cookie

创建于 2015-03-23  ·  61评论  ·  资料来源: request/request

  1. 在 302 上放一个 cookie
  2. 再做一个302
  3. 查看 headers,从第一个 302 开始的 cookie 不存在。
stale

最有用的评论

当然:

request.get('http://google.com/')
   .on('redirect', function() {
       // collect the cookies from 'this' object.
    });

所有61条评论

@Nijikokun你能告诉我更多细节吗? 重定向的域和协议是什么? 谢谢。

@lalitkapoor

不能提供域,因为它们是内部的,应该适用于任何协议,协议是https

Cookie 类型为: http-only; secure

谢谢! 会调查的。 如果不是太麻烦,您可以创建一个失败的测试吗?

我尝试使用节点https模块,它也不会从第一次重定向中保留 cookie。

是否可以获得第一个重定向响应而不是最终响应?

@anklos您可以将请求设置为不遵循重定向并手动进行重定向,在这种情况下您可以获得第一个响应。

@lalitkapoor谢谢。 我刚刚在请求选项中使用followRedirect false 进行了测试。 似乎代码可以在第一个响应处停止,因为statusCode是 302,但是,标头与重定向响应的标头后相同,它不包含第一个set-cookie内容重定向。

image

Cookie 不通过重定向传递
2015 年 3 月 23 日晚上 8:21,“Shane Niu” [email protected]写道:

@lalitkapoor https://github.com/lalitkapoor谢谢。 我设置了followRedirect
在选项中设置为 false。 看来我可以达到第一个响应,因为
statusCode 是 302,但是,标头与重定向后的标头相同
响应的标头,它不包含从第一个开始的 set-cookie 内容
重定向。

[图片:图片]
https://cloud.githubusercontent.com/assets/530145/6777142/bab3d244-d19a-11e4-9c15-4cbc9af23316.png


直接回复此邮件或在 GitHub 上查看
https://github.com/request/request/issues/1502#issuecomment -85323355。

@anklos你能告诉我域名是否不同吗?

我不需要确切的域,只需要知道它们是否相同......如果一个是子域等。

他们在同一个子域上。

@anklos你能修改服务器上的 cookie 吗? 还是您无权执行此操作。 我想尝试一下:将 cookie 上的域值设置为主机名(带子域)。

@Nijikokun您的 cookie 是否设置了域值?

@lalitkapoor不,我没有。 但我可以尝试自己设置一个 https 服务器来测试 cookie 的行为。

虽然对我来说仍然没有意义,为什么浏览器可以从第一个重定向中获取set-cookie内容,但不是我的 node.js 程序?

只是发现我可以通过将重定向选项设置为 false 来获得set-cookie 。 最初我没有得到它,因为我将请求发送到第一个重定向 url,而不是目标 url。

也试过其他语言的http库做同样的测试,结果和nodejs一样

@Nijikokun以上是否满足关注?

对我来说是的

2015 年 4 月 3 日星期五晚上 9:06,Lalit Kapoor [email protected]
写道:

@Nijikokun https://github.com/Nijikokun以上是否满足
忧虑?


直接回复此邮件或在 GitHub 上查看
https://github.com/request/request/issues/1502#issuecomment -89497282。

重定向 cookie 存在类似问题,我使用以下代码在第一次重定向时提取 cookie:

var httpreq = {
                    ...
                    jar: cookieJar
                };



request(httpreq, function (error, response, body) {                   
                    if (typeof response.headers["set-cookie"]!='undefined') {
                        response.headers["set-cookie"].forEach(function(aCookie)
                        {
                            cookieJar.getCookieString(aCookie);
                        });
                    }
});

@lalitkapoor我似乎在 2.61 上遇到了这个问题。

  1. 我从原始请求中提取了一个 cookie。
  2. 前往启动重定向链的同一域中的端点。
  3. 在自动跟随的重定向期间,从未使用过任何 cookie。

当我打开NODE_DEBUG=request时,我在所有重定向上都看到了这种模式:

REQUEST redirect <url>
REQUEST redirect to <url>
REQUEST {}

我想第三个日志输出中应该有我的 cookie。 可以在此处找到记录此内容的行。

另外,在这里需要注意的是,我使用request.defaults来设置一些默认值。

因此,在_not_ 重定向的请求中,第三行看起来有点像这样:

REQUEST {
  followAllRedirects: true,
  jar:  {
     //All the cookies in the cookie jar.
   },
   method: 'GET',
   url: http://theurl.com
}

@Freyert感谢您提供详细信息。 我这周要出差,但这个周末就能看,请随时提醒我。

@lalitkapoor谢谢! 我会在探索的过程中不断记笔记。

作为额外说明:

第三个debug语句在重定向时应该为空,这似乎很奇怪。 至少我希望它包含followAllRedirects

这条线上放置一个调试器。
我可以看到传递给Redirect构造函数的request对象将followAllRedirects设置为 true。 这嵌套在Redirect对象中,该对象具有自己的followAllRedirects设置为false


发现 A:每个Request对象都会收到一个Redirect的实例

因此,当我执行request.defaults时,我正在创建一个具有一些默认值的新请求对象,但它还有一个Redirect对象,该对象管理来自使用该请求对象发出的任何请求的所有重定向。

例如

req(siteA) -> siteB -> siteC -> siteD

这些Redirect Chains保存在Redirect对象的数组中。

_不是_一个突破性的发现。


问题 B:为什么它不使用我的request.default设置来发出其他请求?

这大概就是大金枪鱼了。 由于request.defaults不修改全局Request对象,因此有很多方法不接收这些默认选项。 作为一个假设, Redirect _not_ 使用我的默认请求对象是有意义的,而是使用global对象来发出任何重定向请求。

因此,我们会在上面的第三个调试语句中看到{} 。 理想情况下,会有一种方法来存储 cookie。 也许,我需要求助于全局 cookie jar?

@lalitkapoor ,在处理包含响应重定向的请求时,我遇到了一个非常相似的问题。 我已将followRedirect设置为false顺便说一句。 下面是测试和使用Request时使用Postman调用API的区别:

在 Postman 中测试时

yb j_ a 0c 9ev rrap88 8

使用请求时

所以我用这段代码来做请求:

var request = require("request");
require('request-debug')(request);

var options = { method: 'POST',
  url: 'something hidden',
  qs: 
   { 
      //something hidden
    },
  followRedirect: false,
  jar: true,
  headers: 
   { 'postman-token': '48a42acc-3fa4-3c3e-e826-34e6deb26b09',
     'cache-control': 'no-cache',
     host: 'hidden again',
     referer: 'hidden, sorry' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
  console.log(response.headers)
});

response.header的控制台日志仅显示以下内容:

{ server: 'Cowboy',
  connection: 'close',
  date: 'Tue, 29 Dec 2015 08:59:07 GMT',
  status: '302 Found',
  'x-frame-options': 'SAMEORIGIN',
  'x-xss-protection': '1; mode=block',
  'x-content-type-options': 'nosniff',
  location: 'https://developer.kii.com/',
  'content-type': 'text/html; charset=utf-8',
  'cache-control': 'no-cache',
  'x-request-id': '255fb857-95fa-4aea-8f9e-17036f166083',
  'x-runtime': '0.009318',
  'strict-transport-security': 'max-age=31536000',
  via: '1.1 vegur' }

所以你看, set-cookie标头在某处丢失。 我可以知道你的建议。 如果您需要更多信息,请告诉我

+1

+1,一旦我需要访问的网站在您没有来自重定向的 cookie 时阻止连接,我就无法访问该页面。

@leonardean @jeffreyleeon @patricknn你能看看tests/test-redirect.js并创建一个失败的场景吗?

+1

+1

+1

+1,根据我的调查,这仅在为请求选项对象中的jar属性传入request.jar()对象时才相关。 (即如果jar: true ,没有问题)

+1

有没有人找到解决方法或解决方法? 这似乎仍然是一个问题。

+1

+1

+1

+1

+1

+1(响应标头中缺少 set-cookie)

+1

+1 - 这似乎也是其他标头(例如authorization )的问题。

当前唯一的解决方法是将followRedirects设置为false并“手动”处理重定向吗?

是的

+1

+1

我通过在您的请求对象上使用.on('redirect', function() {})事件处理程序找到了一种解决方法。 使用它来复制 cookie 罐并保存以备后用。 它比手动处理所有重定向要容易得多。

@avadhpatel你可以添加一些关于如何处理回调的伪代码吗?

当然:

request.get('http://google.com/')
   .on('redirect', function() {
       // collect the cookies from 'this' object.
    });

@avadhpatel是的,这不太好,因为要遵循重定向,您应该删除响应标头中的“set-cookie”标头。 正如您在示例中看到的,没有传递给回调的对象。 我不认为“this”对象指的是响应……对我来说似乎很奇怪。

函数中的@jmmclean 'this' 对象实际上是请求对象。

this.response指的是设置了“set-cookie”标头的响应。 我从中复制我的cookies。

@jazarja的评论对我有用。

const that = this;
if (r.headers.hasOwnProperty('set-cookie')) {
    r.headers['set-cookie'].forEach(function(aCookie) {
        that._request.options.jar.setCookie(aCookie);
    });
}

+1

+1

不固定

还没有修复

+1

+1 因此,我不能使用邮递员进行跨域身份验证,这对我来说是个大问题。

我有同样的问题,我没有从请求模块中获得所有的 cookie。
但是当我将 jar 属性设置为 true 时,它​​返回了我所有的 Cookie。
我使用“request-promise”模块进行 http 请求。
以下是我的代码: -
var reqOpt = { url: url, method: 'GET', timeout: 20000, qs: { 'token': token }, form: null, jar: true, headers: { 'User-Agent': 'Request-Promise' }, resolveWithFullResponse: true }

如您所见,我已设置

罐子:真

它对我有用。
希望这会有所帮助。

+1

我可以提个建议吗? 为什么在使用followRedirect: truefollowAllRedirects: true时不返回响应数组。 该数组包含每个重定向的响应。 这样,我们就可以访问所有中间标头(包括 cookie)。

在我的情况下,我有多个重定向(不仅仅是一个重定向,当我访问一个 URL 时会发生 3 个重定向)。 我已经尝试了上述所有建议,但没有成功。 任何人都可以分享手动处理重定向代码和检索 cookie 吗? 谢谢。

@lalitkapoor这曾经解决过吗? 它正在处理中吗?

我认为这看起来类似于第 72 行中对 401 重定向的授权标头所做的事情。 没有做太多的nodejs补丁; 但如果我设法修复它,我会很乐意发送 PR。

更新:我以为我遇到了这个问题,但后来我添加了jar: j,而不是jar: true并且 cookie 似乎正在通过。 var j = request.jar(); - 希望这有助于下一个人。

@jonmifsud 👍 使用request.jar()结果而不是true对我有用,谢谢!

此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 感谢你的贡献。

此页面是否有帮助?
0 / 5 - 0 等级