Request: Cookies perdidos durante vários redirecionamentos

Criado em 23 mar. 2015  ·  61Comentários  ·  Fonte: request/request

  1. Coloque um cookie em um 302
  2. Faça outro 302
  3. Veja os cabeçalhos, o cookie do primeiro 302 não existe.
stale

Comentários muito úteis

Certo:

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

Todos 61 comentários

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.

image

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.

  1. Eu pego um cookie do meu pedido original.
  2. Vá para o endpoint no mesmo domínio que inicia uma cadeia de redirecionamentos.
  3. Durante os redirecionamentos seguidos automaticamente, nenhum cookie é usado.

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 .


Descoberta A: Cada objeto 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.


Problema B: Por que não está usando minhas configurações de 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:

ao testar no Postman

yb j_ a 0c 9ev rrap88 8

ao usar a solicitação

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

matrosov-nikita picture matrosov-nikita  ·  3Comentários

mlegenhausen picture mlegenhausen  ·  4Comentários

svlungade picture svlungade  ·  3Comentários

ghost picture ghost  ·  3Comentários

pixarfilmz112 picture pixarfilmz112  ·  3Comentários