from - send cookie ajax jquery




Por que o método.ajax() do jquery não está enviando meu cookie de sessão? (8)

Depois de fazer login via $.ajax() em um site, estou tentando enviar uma segunda solicitação $.ajax() para esse site - mas quando verifico os cabeçalhos enviados usando o FireBug, não há cookies de sessão incluídos na solicitação .

O que estou fazendo de errado?


Apenas meus 2 centavos em definir problema de cookie PHPSESSID quando em localhost e sob o ambiente dev. Eu faço a chamada AJAX para o endpoint da minha API REST no locahost. Digamos que seu endereço seja mysite.localhost/api/member/login/ (host virtal no meu ambiente de desenvolvimento).

  • Quando faço este pedido no Postman , as coisas correm bem e o PHPSESSID é definido com a resposta.

  • Quando eu solicito este endpoint via AJAX a partir da página proxy do Browsersync (por exemplo, de 122.133.1.110:3000/test/api/login.php na minha linha de endereço do navegador, veja o domínio é diferente vs mysite.localhost ) PHPSESSID não aparece entre os cookies .

  • Quando faço este pedido diretamente da página no mesmo domínio (por exemplo, mysite.localhost/test/api/login.php ), o PHPSESSID está bem definido.

Portanto, este é um problema de cookies de solicitação de origem de origem cruzada, conforme mencionado na resposta @flu acima


Chamadas de AJAX só enviam Cookies se o URL que você está chamando estiver no mesmo domínio que seu script de chamada.

Isso pode ser um problema de domínio cruzado.

Talvez você tenha tentado chamar uma url de www.domain-a.com enquanto seu script de chamada estava em www.domain-b.com (Em outras palavras: Você fez uma chamada entre domínios, caso em que o navegador não enviará nenhum cookie para proteger sua privacidade).

Neste caso, suas opções são:

  • Escreva um pequeno proxy que reside no domínio-b e encaminha seus pedidos para o domínio-a. Seu navegador permitirá que você chame o proxy porque ele está no mesmo servidor que o script de chamada.
    Este proxy pode então ser configurado por você para aceitar um nome de cookie e um parâmetro de valor que ele possa enviar para o domínio-a. Mas para que isso funcione, você precisa saber o nome do cookie e valorizar seu servidor no domínio-a quer para autenticação.
  • Se você estiver buscando objetos JSON, tente usar uma solicitação JSONP . O jQuery suporta isso. Mas você precisa alterar seu serviço no domínio-a para que ele retorne respostas JSONP válidas.

Fico feliz que isso ajudou mesmo um pouco.


Depois de experimentar as outras soluções e ainda não ter conseguido fazê-lo funcionar, descobri qual era o problema no meu caso. Eu mudei contentType de "application / json" para "text / plain".

$.ajax(fullUrl, {
    type: "GET",
    contentType: "text/plain",
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true
});

Eu estava tendo esse mesmo problema e fazendo algumas verificações meu script estava simplesmente não recebendo o cookie de sessão.

Eu descobri olhando para o valor do cookie sessionid no navegador que meu framework (Django) estava passando o cookie sessionid com HttpOnly como padrão. Isso significava que os scripts não tinham acesso ao valor de sessionid e, portanto, não o transmitiam junto com as solicitações. É meio ridículo que o HttpOnly seja o valor padrão quando tantas coisas usam o Ajax, o que exigiria restrição de acesso.

Para corrigir isso, eu mudei uma configuração (SESSION_COOKIE_HTTPONLY = False), mas em outros casos, pode ser um sinalizador "HttpOnly" no caminho do cookie


Já existem muitas respostas boas para essa pergunta, mas achei que seria útil esclarecer o caso em que você esperaria que o cookie da sessão fosse enviado porque o domínio do cookie corresponde, mas não está sendo enviado porque a solicitação do AJAX é sendo feito para um subdomínio diferente. Nesse caso, tenho um cookie que é atribuído ao domínio * .mydomain.com e estou querendo que ele seja incluído em uma solicitação AJAX para different.mydomain.com ". Por padrão, o cookie não é enviado. Você não precisa desabilitar o HTTPONLY no cookie da sessão para resolver esse problema, basta fazer o que o wombling sugeriu ( https://.com/a/23660618/545223 ) e fazer o seguinte.

1) Adicione o seguinte ao seu pedido de ajax.

xhrFields: { withCredentials:true }

2) Adicione o seguinte aos seus cabeçalhos de resposta para recursos no subdomínio diferente.

Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true

Se você estiver desenvolvendo em localhost ou uma porta em localhost, como localhost:8080 , além das etapas descritas nas respostas acima, você também precisará garantir que não esteja passando um valor de domínio no cabeçalho Set-Cookie.
Você não pode definir o domínio para localhost no cabeçalho Set-Cookie - isso é incorreto - apenas omitir o domínio.

Veja Cookies no host local com domínio explícito e Por que o asp.net não cria cookies no host local?


Usando

xhrFields: { withCredentials:true }

como parte da minha chamada jQuery ajax era apenas parte da solução. Eu também precisava ter os cabeçalhos retornados na resposta OPTIONS do meu recurso:

Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true

Era importante que apenas uma permissão "origem" estivesse no cabeçalho de resposta da chamada OPTIONS e não "*". Consegui isso lendo a origem da solicitação e preenchendo-a de volta na resposta - provavelmente contornando a razão original da restrição, mas no meu caso de uso a segurança não é primordial.

Eu pensei que vale a pena mencionar explicitamente o requisito para apenas uma origem, já que o padrão W3C permite uma lista separada por espaço - mas o Chrome não! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB o bit "na prática".


Você precisa inicializar a sessão antes de tentar fazer o login.

Para php, você tem que fazer

session_start();

na página de onde você inicia a chamada de login ajax.

Para que o SESSIONID seja criado e armazenado o cookie do navegador. E enviado junto com o cabeçalho da solicitação durante a chamada do ajax, se você fizer a solicitação do ajax para o mesmo domínio

Para as sucessivas chamadas do ajax, o navegador usará o SESSIONID que foi criado e armazenado inicialmente no cookie do navegador, a menos que limpe o cookie do navegador ou faça logout (ou defina outro cookie)





cookies