2017-03-24 17 views
20

Wysyłam żądania od klienta do mojego serwera Express.js za pomocą Axios.Spraw, aby Axios automatycznie wysyłał pliki cookie w swoich żądaniach.

Ustawiam plik cookie na kliencie i chcę go odczytać ze wszystkich żądań Axios bez ręcznego dodawania ich ręcznie.

To moja prośba przykładem stronie klienta:

axios.get(`some api url`).then(response => ... 

Próbowałem dostęp nagłówków lub ciasteczka za pomocą tych właściwości w moim serwerze Express.js:

req.headers 
req.cookies 

Żaden z nich nie zawierała żadnych ciasteczek. Korzystam z oprogramowania pośredniego do obsługi parserów plików cookie:

app.use(cookieParser()) 

Jak ustawić automatyczne wysyłanie plików cookie przez aplikację Axios?

Edit:

ustawić ciasteczko na kliencie tak:

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ż to również za pomocą Axios, to nie ma znaczenia dla kwestii. Po prostu chcę umieścić pliki cookie we wszystkich moich żądaniach po ustawieniu pliku cookie.

+0

w jaki sposób ustawiłeś plik cookie na kliencie? pokaż przykład kodu proszę :) –

+0

@TzookBarNoy Dodany kod w pytaniu – Kunok

Odpowiedz

43

Miałem ten sam problem i naprawiłem go przez właściwość withCredential.

XMLHttpRequest z innej domeny nie może ustawić wartości plików cookie dla ich własnej domeny, chyba że przy ustawieniuKredentials ustawiono wartość true przed wysłaniem żądania.

axios.get('some api url', {withCredentials: true}); 
+0

Akceptuję tę odpowiedź jako pierwszą i poprawnie sformatowaną, dzięki! – Kunok

+0

Jeśli próbujesz połączyć się z aplikacją Express, musisz użyć cors i użyć tych ustawień. Pochodzenie żądania jest wymagane. app.use (cors ({poświadczenia: prawda, pochodzenie: "http: // localhost: 8080"})); – DogCoffee

+1

należy zauważyć, że działa to tylko wtedy, gdy 'Access-Control-Allow-Origin' w nagłówku odpowiedzi nie jest ustawiony na symbol wieloznaczny (*) –

1

Dostajesz mieszane dwie myśli.

Trzeba "reagują Cookie" i "Axios"

reagować-cookies => jest do obsługi cookie po stronie klienta

Axios => jest do wysyłania ajax żądania do serwera

Dzięki tym informacjom, jeśli chcesz, aby pliki cookie ze strony klienta były przekazywane również po stronie zaplecza, musisz połączyć je ze sobą.

Uwaga z "reagować-Cookie" Readme:

izomorficzna ciasteczka!

Aby móc uzyskać dostęp do plików cookie użytkownika podczas renderowania serwera, użytkownik może używać plugToRequest lub setRawCookie.

link to readme

Jeśli to jest to, czego potrzebujesz, to świetnie.

Jeśli nie, proszę skomentuj, abym mógł rozwinąć więcej.

+0

Co dokładnie robi "plugToRequest"? Myślałem, aby uzyskać dostęp do plików cookie na serwerze węzła, wszystko czego potrzebuje to oprogramowanie pośredniczące "cookie-parser" (zakładając Express)? – geoboy

5

nie jestem zaznajomiony z Axios, ale o ile wiem, w javascript i ajax istnieje opcja

withCredentials: true 

To automatycznie wysłać plik cookie na stronie klienta. Jako przykład, scenariusz ten jest również generowane z passportjs, który ustawia plik cookie na serwerze

2

Ważne jest również ustawienie niezbędnych nagłówków w odpowiedzi ekspresowej. To są te, które zadziałały:

app.use(function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', yourExactHostname); 
    res.header('Access-Control-Allow-Credentials', true); 
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 
    next(); 
}); 
+0

Dodawanie ** 'X-PINGOTHER' ** do' Access-Control-Allow-Headers' było obowiązkowe dla mnie (Node.js 6.9 z Express 4.16, Chrome 63). Sprawdź ** post ** JakeElder ** w tym wydaniu GitHub: https://github.com/axios/axios/issues/191#issuecomment-311069164 –

Powiązane problemy