Wysyłam żądania od klienta do mojego serwera Express.js za pomocą Axios.
Ustawiam plik cookie na kliencie i chcę odczytać ten plik cookie ze wszystkich żądań Axios bez ręcznego dodawania ich do żądania ręcznego.
Oto przykład żądania od strony mojego klienta:
axios.get(`some api url`).then(response => ...
Próbowałem uzyskać dostęp do nagłówków lub plików cookie, korzystając z następujących właściwości na moim serwerze Express.js:
req.headers
req.cookies
Żaden z nich nie zawierał żadnych plików cookie. Używam oprogramowania pośredniczącego parsera plików cookie:
app.use(cookieParser())
Jak sprawić, by Axios automatycznie wysyłało pliki cookie w żądaniach?
Edytować:
Ustawiłem plik cookie na kliencie w ten sposób:
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:'/'})
}
})
}
...
Chociaż używa również Axios, nie ma znaczenia dla pytania. Chcę po prostu osadzić pliki cookie we wszystkich moich żądaniach po ustawieniu pliku cookie.
Odpowiedzi:
Miałem ten sam problem i naprawiłem go, korzystając z
withCredentials
właściwości.XMLHttpRequest z innej domeny nie może ustawić wartości plików cookie dla własnej domeny, chyba że właściwość withCredentials ma wartość true przed wykonaniem żądania.
źródło
Access-Control-Allow-Origin
nagłówek w odpowiedzi nie jest ustawiony na symbol wieloznaczny (*)Access-Control-Allow-Origin
nie jest ustawiony na*
to, oznacza to, że nieAccess-Control-Allow-Origin
wartości domeny, z której chcesz wysłać żądanie XHR. np.https://a.com
jest serwerem,https://b.com
jest klientem ihttps://b.com
jest ładowany do czyjejś przeglądarki i używa goXMLHTTPRequest
do wysyłania żądańhttps://a.com
. Dodatkowo, aby ustawićXMLHTTPRequest
(zainicjowane whttps://a.com
)withCredential: true
, serwer -https://b.com
również musi być skonfigurowany, aby nagłówek odpowiedzi zawierałAccess-Control-Allow-Origin: https://a.com
TL; DR:
{ withCredentials: true }
lubaxios.defaults.withCredentials = true
Z dokumentacji Axios
withCredentials
wskazuje, czy żądania kontroli dostępu między lokacjami powinny być wykonywane przy użyciu poświadczeńJeśli spełniasz
{ withCredentials: true }
swoją prośbę, powinno działać.Lepszym sposobem byłoby ustawienie
withCredentials
jaktrue
waxios.defaults
źródło
Nie jestem zaznajomiony z Axios, ale o ile wiem, w javascript i ajax jest opcja
Spowoduje to automatyczne wysłanie pliku cookie po stronie klienta. Na przykład ten scenariusz jest również generowany za pomocą paszportjs, które ustawiają plik cookie na serwerze
źródło
Ważne jest również ustawienie niezbędnych nagłówków w odpowiedzi ekspresowej. Oto te, które pracowały dla mnie:
źródło
X-PINGOTHER
doAccess-Control-Allow-Headers
było dla mnie obowiązkowe (Node.js 6.9 z Express 4.16, Chrome 63). Sprawdź post JakeEldera w tym numerze GitHub: github.com/axios/axios/issues/191#issuecomment-311069164Innym rozwiązaniem jest skorzystanie z tej biblioteki:
https://github.com/3846masa/axios-cookiejar-support
który integruje obsługę „Tough Cookie” w Axios. Zauważ, że to podejście nadal wymaga
withCredentials
flagi.źródło
dla ludzi, którzy nadal nie są w stanie go rozwiązać, ta odpowiedź mi pomogła. odpowiedź dotycząca przepełnienia stosu: 34558264
TLDR; należy ustawić
{withCredentials: true}
zarówno żądanie GET, jak i POST (pobieranie pliku cookie) zarówno dla axios, jak i dla pobierania.źródło
{ withCredentials: true }
żądanie GET nie przyniosło żadnego efektu.withCredentials: true
do konfiguracji żądania, ale nie dotyczy to szczegółów. Spędziłem prawie 2 dni próbując rozwiązać problem, dopóki nie natknąłem się na tozestaw
axios.defaults.withCredentials = true;
lub dla jakiejś konkretnej prośby, której możesz użyć
axios.get(url,{withCredentials:true})
na przykład: jeśli twój front-end, który sprawia, że żądanie działa na localhost: 3000, ustaw nagłówek odpowiedzi jako
również zestaw
źródło
Możesz użyć
withCredentials
właściwości, aby przekazać pliki cookie w żądaniu.Po ustawieniu
{ withCredentials: true }
możesz napotkać problem z różnymi źródłami. Aby rozwiązać ten problem, musisz użyćTutaj możesz przeczytać o withCredentials
źródło
Pomieszasz te dwie myśli.
Masz „plik cookie reakcji” i „axios”
React-cookie => służy do obsługi pliku cookie po stronie klienta
axios => służy do wysyłania żądań ajax do serwera
Mając te informacje, jeśli chcesz, aby pliki cookie ze strony klienta były również przekazywane po stronie zaplecza, musisz je połączyć.
Uwaga z pliku Readme „React-cookie”:
link do pliku readme
Jeśli tego potrzebujesz, świetnie.
Jeśli nie, proszę o komentarz, abym mógł rozwinąć więcej.
źródło
plugToRequest
dokładnie robi? Pomyślałem, że aby uzyskać dostęp do plików cookie na serwerze węzła, wystarczy tylkocookie-parser
oprogramowanie pośredniczące (zakładając Express)?Więc miałem dokładnie ten sam problem i straciłem około 6 godzin mojego życia na szukaniu, miałem
withCredentials: true
Ale przeglądarka nadal nie zapisała pliku cookie, dopóki z jakiegoś dziwnego powodu nie wpadłem na pomysł, aby przetasować ustawienia konfiguracji:
Wygląda na to, że zawsze powinieneś najpierw wysłać klucz „withCredentials”.
źródło