嘿@Nijikokun你能告诉我更多细节吗? 重定向的域和协议是什么? 谢谢。
嘿@lalitkapoor
不能提供域,因为它们是内部的,应该适用于任何协议,协议是https
。
Cookie 类型为: http-only; secure
谢谢! 会调查的。 如果不是太麻烦,您可以创建一个失败的测试吗?
我尝试使用节点https
模块,它也不会从第一次重定向中保留 cookie。
是否可以获得第一个重定向响应而不是最终响应?
@anklos您可以将请求设置为不遵循重定向并手动进行重定向,在这种情况下您可以获得第一个响应。
@lalitkapoor谢谢。 我刚刚在请求选项中使用followRedirect
false 进行了测试。 似乎代码可以在第一个响应处停止,因为statusCode
是 302,但是,标头与重定向响应的标头后相同,它不包含第一个set-cookie
内容重定向。
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 上遇到了这个问题。
当我打开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
。
Request
对象都会收到一个Redirect
的实例因此,当我执行request.defaults
时,我正在创建一个具有一些默认值的新请求对象,但它还有一个Redirect
对象,该对象管理来自使用该请求对象发出的任何请求的所有重定向。
例如
req(siteA) -> siteB -> siteC -> siteD
这些Redirect Chains
保存在Redirect
对象的数组中。
_不是_一个突破性的发现。
request.default
设置来发出其他请求?这大概就是大金枪鱼了。 由于request.defaults
不修改全局Request
对象,因此有很多方法不接收这些默认选项。 作为一个假设, Redirect
_not_ 使用我的默认请求对象是有意义的,而是使用global
对象来发出任何重定向请求。
因此,我们会在上面的第三个调试语句中看到{}
。 理想情况下,会有一种方法来存储 cookie。 也许,我需要求助于全局 cookie jar?
嗨@lalitkapoor ,在处理包含响应重定向的请求时,我遇到了一个非常相似的问题。 我已将followRedirect
设置为false
顺便说一句。 下面是测试和使用Request时使用Postman调用API的区别:
所以我用这段代码来做请求:
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: true
或followAllRedirects: true
时不返回响应数组。 该数组包含每个重定向的响应。 这样,我们就可以访问所有中间标头(包括 cookie)。
在我的情况下,我有多个重定向(不仅仅是一个重定向,当我访问一个 URL 时会发生 3 个重定向)。 我已经尝试了上述所有建议,但没有成功。 任何人都可以分享手动处理重定向代码和检索 cookie 吗? 谢谢。
@lalitkapoor这曾经解决过吗? 它正在处理中吗?
我认为这看起来类似于第 72 行中对 401 重定向的授权标头所做的事情。 没有做太多的nodejs补丁; 但如果我设法修复它,我会很乐意发送 PR。
更新:我以为我遇到了这个问题,但后来我添加了jar: j,
而不是jar: true
并且 cookie 似乎正在通过。 var j = request.jar();
- 希望这有助于下一个人。
@jonmifsud 👍 使用request.jar()
结果而不是true
对我有用,谢谢!
此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 感谢你的贡献。
最有用的评论
当然: