Estou enviando solicitações do cliente para meu servidor Express.js usando Axios.
Eu defini um cookie no cliente e quero ler esse cookie de todas as solicitações do Axios sem adicioná-las manualmente para solicitar manualmente.
Este é o meu exemplo de solicitação do cliente:
axios.get(`some api url`).then(response => ...
Tentei acessar cabeçalhos ou cookies usando estas propriedades em meu servidor Express.js:
req.headers
req.cookies
Nenhum deles continha cookies. Estou usando o middleware de analisador de cookies:
app.use(cookieParser())
Como faço para que o Axios envie cookies nas solicitações automaticamente?
Editar:
Eu defino o cookie no cliente assim:
import cookieClient from 'react-cookie'
...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
axios.get('path/to/my/cookie/api').then(response => {
if(response.status == 200){
cookieClient.save('cookie-name', response.data, {path:'/'})
}
})
}
...
Embora também esteja usando Axios, não é relevante para a questão. Eu simplesmente quero incorporar cookies em todas as minhas solicitações assim que um cookie for definido.
Respostas:
Eu tive o mesmo problema e resolvi usando o
withCredentials
imóvel.XMLHttpRequest de um domínio diferente não pode definir valores de cookie para seu próprio domínio, a menos que withCredentials seja definido como true antes de fazer a solicitação.
fonte
Access-Control-Allow-Origin
cabeçalho de resposta não estiver definido como curinga (*)Access-Control-Allow-Origin
não estiver definido para*
isso significa que não vou fazer a solicitação para esse servidor por causa do CORS certoAccess-Control-Allow-Origin
o valor do domínio do qual você deseja fazer a solicitação XHR. por exemplo,https://a.com
é o servidor,https://b.com
é o cliente,https://b.com
está carregado no navegador de alguém e está usandoXMLHTTPRequest
para fazer uma solicitaçãohttps://a.com
. Além deXMLHTTPRequest
(iniciado emhttps://a.com
) definirwithCredential: true
, o servidor -https://b.com
também precisa ser configurado para que o cabeçalho de resposta contenhaAccess-Control-Allow-Origin: https://a.com
TL; DR:
{ withCredentials: true }
ouaxios.defaults.withCredentials = true
Da documentação dos axios
withCredentials
indica se as solicitações de controle de acesso entre sites devem ou não ser feitas usando credenciaisSe você passar
{ withCredentials: true }
com seu pedido, deve funcionar.Uma maneira melhor seria definir
withCredentials
comotrue
emaxios.defaults
fonte
Não estou familiarizado com o Axios, mas pelo que sei em javascript e ajax existe uma opção
Isso enviará automaticamente o cookie para o lado do cliente. Por exemplo, este cenário também é gerado com passportjs, que define um cookie no servidor
fonte
Também é importante definir os cabeçalhos necessários na resposta expressa. Estes são os que funcionaram para mim:
fonte
X-PINGOTHER
emAccess-Control-Allow-Headers
foi obrigatório para mim (Node.js 6.9 com Express 4.16, Chrome 63). Verifique a postagem de JakeElder sobre este problema no GitHub: github.com/axios/axios/issues/191#issuecomment-311069164Outra solução é usar esta biblioteca:
https://github.com/3846masa/axios-cookiejar-support
que integra o suporte "Tough Cookie" ao Axios. Observe que essa abordagem ainda requer o
withCredentials
sinalizador.fonte
para as pessoas que ainda não conseguiram resolver, essa resposta me ajudou. resposta stackoverflow: 34558264
TLDR; é necessário definir
{withCredentials: true}
tanto na solicitação GET quanto na solicitação POST (obtendo o cookie) para ambos os axios, bem como buscar.fonte
{ withCredentials: true }
solicitação GET não teve qualquer efeito.withCredentials: true
a configuração da solicitação, mas não esse detalhe. Passei quase 2 dias tentando resolver o problema até que me deparei com issoconjunto
axios.defaults.withCredentials = true;
ou para algum pedido específico que você pode usar
axios.get(url,{withCredentials:true})
por exemplo: se o seu front-end que faz a solicitação for executado em localhost: 3000, defina o cabeçalho de resposta como
também definido
fonte
Você pode usar
withCredentials
propriedade para passar cookies na solicitação.Ao definir,
{ withCredentials: true }
você pode encontrar problemas de origem cruzada. Para resolver isso, você precisa usarAqui você pode ler sobre withCredentials
fonte
Você está misturando os dois pensamentos.
Você tem "react-cookie" e "axios"
react-cookie => é para lidar com o cookie no lado do cliente
axios => é para enviar solicitações ajax para o servidor
Com essas informações, se você quiser que os cookies do lado do cliente sejam comunicados também no lado do back-end, você precisará conectá-los.
Nota do Leiame "react-cookie":
link para ler-me
Se é isso que você precisa, ótimo.
Se não, por favor, comente para que eu possa elaborar mais.
fonte
plugToRequest
exatamente faz? Pensei em acessar cookies no servidor de nó, tudo que se precisa é ocookie-parser
middleware (assumindo Express)?Eu tive exatamente o mesmo problema e perdi cerca de 6 horas da minha vida procurando,
withCredentials: true
Mas o navegador ainda não salvou o cookie até que, por algum motivo estranho, tive a ideia de embaralhar a definição de configuração:
Parece que você deve sempre enviar a chave 'withCredentials' primeiro.
fonte