Ei @Nijikokun você pode me dar mais detalhes. Quais eram os domínios e protocolos dos redirecionamentos? Obrigado.
Oi @lalitkapoor
Não posso dar os domínios pois são internos, deveria funcionar com qualquer, o protocolo era https
.
O tipo de cookie era: http-only; secure
obrigado! Vai analisar. Se não for muito problema, você poderia criar um teste com falha?
Eu tentei com o módulo node https
, ele também não preserva o cookie do primeiro redirecionamento.
É possível obter a primeira resposta de redirecionamento em vez da resposta final?
@anklos você pode definir a solicitação para não seguir os redirecionamentos e fazer o redirecionamento manualmente, nesse caso você pode obter a primeira resposta.
@lalitkapoor obrigado. Acabei de fazer um teste com followRedirect
false na opção request. Parece que o código pode parar na primeira resposta, pois o statusCode
é 302, no entanto, o cabeçalho é o mesmo que após redirecionar o cabeçalho da resposta, ele não contém set-cookie
conteúdo do primeiro redirecionar.
Os cookies não são passados com redirecionamentos
Em 23 de março de 2015 20:21, "Shane Niu" [email protected] escreveu:
@lalitkapoor https://github.com/lalitkapoor obrigado. Eu defino followRedirect
para false na opção. Parece que eu poderia chegar à primeira resposta, como
o statusCode é 302, no entanto, o cabeçalho é o mesmo após os redirecionamentos
cabeçalho da resposta, ele não contém conteúdo set-cookie do primeiro
redirecionar.[imagem: imagem]
https://cloud.githubusercontent.com/assets/530145/6777142/bab3d244-d19a-11e4-9c15-4cbc9af23316.png—
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/request/request/issues/1502#issuecomment -85323355.
@anklos você pode me dizer se os domínios são diferentes?
Eu não preciso dos domínios exatos, só preciso saber se eles são os mesmos... se um é um subdomínio, etc.
eles estão no mesmo subdomínio.
@anklos você pode modificar o cookie nos servidores? ou você não tem acesso para fazer isso. Eu gostaria de tentar algo: definir o valor do domínio no cookie para o nome do host (com subdomínio).
@Nijikokun seus cookies têm o valor de domínio definido neles?
@lalitkapoor não, eu não. mas posso tentar configurar um servidor https para testar o comportamento do cookie.
embora ainda não faça sentido para mim por que o navegador pode obter o conteúdo set-cookie
do primeiro redirecionamento, mas não o meu programa node.js?
Basta descobrir que posso obter set-cookie
definindo a opção de redirecionamento false. Originalmente eu não entendi porque eu envio a solicitação para o primeiro URL de redirecionamento, não para o URL de destino.
Também tentei outras bibliotecas http de linguagem para fazer o mesmo teste, os resultados são os mesmos do nodejs
@Nijikokun o acima satisfaz a preocupação?
Para mim sim
Em sex, 3 de abril de 2015 às 21h06, Lalit Kapoor [email protected]
escrevi:
@Nijikokun https://github.com/Nijikokun o acima satisfaz o
preocupação?—
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/request/request/issues/1502#issuecomment -89497282.
Tendo problema semelhante com o cookie de redirecionamento, uso o seguinte código para extrair o cookie no primeiro redirecionamento:
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 Parece que estou tendo esse problema no 2.61.
Quando ligo NODE_DEBUG=request
, vejo este padrão em todos os redirecionamentos:
REQUEST redirect <url>
REQUEST redirect to <url>
REQUEST {}
Imagino que a terceira saída de log deve conter meus cookies. A linha onde isso é registrado pode ser encontrada aqui .
Além disso, é bom observar aqui que estou usando request.defaults
para definir alguns padrões.
Portanto, na solicitação que _não_ redireciona essa terceira linha se parece um pouco com isso:
REQUEST {
followAllRedirects: true,
jar: {
//All the cookies in the cookie jar.
},
method: 'GET',
url: http://theurl.com
}
@Freyert Obrigado pelos detalhes. Estou viajando esta semana, mas poderei vê-lo neste fim de semana, sinta-se à vontade para me lembrar.
@lalitkapoor Obrigado! Vou continuar tomando notas enquanto exploro.
Como nota extra:
Parece estranho que a terceira instrução debug
esteja vazia em redirecionamentos. No mínimo, espero que contenha followAllRedirects
.
Colocando um depurador nesta linha .
Eu posso ver que o objeto request
passado para o construtor Redirect
tem followAllRedirects
definido como true. Isso fica aninhado dentro do objeto Redirect
que tem seu próprio followAllRedirects
que é definido como false
.
Request
recebe uma instância de Redirect
Então quando eu faço request.defaults
, estou criando um novo objeto de requisição com alguns padrões, mas também tem um objeto Redirect
que gerencia todos os redirecionamentos de qualquer requisição feita com aquele objeto de requisição.
Por exemplo
req(siteA) -> siteB -> siteC -> siteD
Esses Redirect Chains
são mantidos em um array no objeto Redirect
.
_Não_ uma descoberta inovadora.
request.default
para fazer outras solicitações?Este é provavelmente o atum grande. Como request.defaults
não modifica o objeto global Request
, existem muitos métodos que não recebem essas opções padrão. Como hipótese, faz sentido que Redirect
_não_ esteja usando meu objeto de solicitação padrão, mas sim o objeto global
para fazer qualquer solicitação de redirecionamento.
Portanto, veríamos {}
na terceira instrução de depuração acima. Idealmente, haveria uma maneira de armazenar os cookies. Talvez eu precise recorrer ao pote de biscoitos global?
Oi @lalitkapoor , tenho um problema muito semelhante ao lidar com solicitações que contêm redirecionamento em resposta. Eu configurei followRedirect
para false
btw. abaixo está a diferença de chamar a API usando Postman ao testar e usar Request:
então eu uso este código para fazer a solicitação:
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)
});
e o log do console de response.header
mostra apenas isso:
{ 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' }
então você vê, o cabeçalho set-cookie
está faltando em algum lugar. Posso saber sua sugestão. Se precisar de mais alguma informação, por favor me avise
+1
+1, uma vez que o site que eu preciso acessar bloqueia a conexão quando você não tem cookies do redirecionamento, não consigo acessar a página.
@leonardean @jeffreyleeon @patricknn Você pode olhar para tests/test-redirect.js
e criar um cenário falho?
+1
+1
+1
+1, de minhas investigações, isso só é relevante quando um objeto request.jar()
é passado para o atributo jar
no objeto de opções de solicitação. (ou seja, se jar: true
, sem problemas)
+1
Alguém já encontrou uma solução ou solução para isso? Ainda parece ser um problema.
+1
+1
+1
+1
+1
+1 (set-cookie está faltando nos cabeçalhos de resposta)
+1
+1 - este parece ser um problema com outros cabeçalhos (por exemplo, authorization
) também.
A única solução atual é definir followRedirects
para false
e lidar com os redirecionamentos "manualmente"?
AFAIK sim
+1
+1
Encontrei uma solução alternativa usando o manipulador de eventos .on('redirect', function() {})
em seu objeto de solicitação. Use-o para copiar o pote de biscoitos e salvá-lo para mais tarde. É muito mais fácil do que lidar com todos os redirecionamentos manualmente.
@avadhpatel você pode adicionar algum psuedocode sobre como você lidaria com o retorno de chamada?
Certo:
request.get('http://google.com/')
.on('redirect', function() {
// collect the cookies from 'this' object.
});
@avadhpatel sim, isso não funciona muito bem porque para seguir os redirecionamentos, você deve remover o cabeçalho 'set-cookie' nos cabeçalhos de resposta. Como você pode ver em seu exemplo, não há nenhum objeto passado para o retorno de chamada. Eu não acho que o objeto 'this' está se referindo à resposta.... parece estranho para mim.
@jmmclean 'this' objeto na função é na verdade o objeto de solicitação.
O this.response
refere-se à resposta que tem o cabeçalho 'set-cookie' definido. Eu copio meus cookies disso.
O comentário de @jazarja funcionou para mim.
const that = this;
if (r.headers.hasOwnProperty('set-cookie')) {
r.headers['set-cookie'].forEach(function(aCookie) {
that._request.options.jar.setCookie(aCookie);
});
}
+1
+1
não consertado
ainda não foi corrigido
+1
+1 Não posso usar o carteiro para nossa autenticação entre domínios por causa disso, é um espetáculo para mim.
Eu tenho o mesmo problema, não recebi todos os cookies do módulo de solicitação.
Mas quando defini o atributo jar como true, ele me retornou todos os cookies.
Eu usei o módulo "request-promise" para solicitação http.
Abaixo está meu código: -
var reqOpt = {
url: url,
method: 'GET',
timeout: 20000,
qs: { 'token': token },
form: null,
jar: true,
headers: {
'User-Agent': 'Request-Promise'
},
resolveWithFullResponse: true
}
Como você pode ver, eu configurei
jar: verdade
e funcionou para mim.
Espero que isso ajude.
+1
Posso fazer uma sugestão? Por que não retornar uma matriz de respostas ao usar followRedirect: true
ou followAllRedirects: true
. A matriz contém as respostas de cada redirecionamento. Desta forma, podemos acessar todos os cabeçalhos intermediários (incluindo cookies).
Eu tenho vários redirecionamentos no meu caso (não apenas um redirecionamento, existem 3 redirecionamentos que acontecem quando eu acesso um URL). Já tentei todas as sugestões acima, mas sem sucesso. Alguém pode compartilhar o manuseio manual do código de redirecionamento e a recuperação dos cookies? Obrigado.
@lalitkapoor isso já foi abordado? E está sendo trabalhado?
Acho que isso se parece com o que está sendo feito com o cabeçalho de autorização na linha 72 para redirecionamentos 401. Não fiz muitos patches de nodejs; mas ficaria feliz em enviar um PR se eu conseguir corrigi-lo.
Atualização: pensei que tinha esse problema, mas adicionei jar: j,
em vez de jar: true
e os cookies parecem estar passando. onde var j = request.jar();
- espero que isso ajude a próxima pessoa.
@jonmifsud 👍 usar request.jar()
result em vez de true
funciona para mim, obrigado!
Este problema foi marcado automaticamente como obsoleto porque não teve atividade recente. Será fechado se não ocorrer mais nenhuma atividade. Obrigado por suas contribuições.
Comentários muito úteis
Certo: