Axios'un isteklerinde otomatik olarak çerez göndermesini sağlayın


121

Axios kullanarak istemciden Express.js sunucuma istek gönderiyorum.

İstemciye bir çerez koyuyorum ve bu çerezi tüm Axios isteklerinden, elle talep etmek için manuel olarak eklemeden okumak istiyorum.

Bu benim müşteri tarafındaki istek örneğim:

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

Express.js sunucumdaki şu özellikleri kullanarak başlıklara veya çerezlere erişmeye çalıştım:

req.headers
req.cookies

Hiçbiri çerez içermiyordu. Çerez ayrıştırıcı ara yazılım kullanıyorum:

app.use(cookieParser())

Axios'un isteklerde otomatik olarak çerez göndermesini nasıl sağlayabilirim?

Düzenle:

İstemciye şu şekilde çerez koyuyorum:

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:'/'})
        }
      })
    }
...

Axios'u da kullanıyor olsa da, soruyla alakalı değil. Bir tanımlama bilgisi ayarlandıktan sonra tüm isteklerime tanımlama bilgileri yerleştirmek istiyorum.


1
Çerezi müşteriye nasıl yerleştirdiniz? kod örneğini göster lütfen :)
Tzook Bar Noy

@TzookBarNoy Söz konusu kod eklendi
Kunok

Çerezler, müşteri tarafından değil Set-Cookie'ye sahip sunucular tarafından belirlenir, sanırım müşteri üzerindeki çerezi okumaktan bahsediyorsunuz. Çerez protokolüne göre, müşteri, çerez yayıncı sunucusuna yaptığı isteklere bir Çerez başlığı eklemelidir.
Hans Poo

Yanıtlar:


243

Aynı sorunu yaşadım ve withCredentialsözelliği kullanarak düzelttim .

Farklı bir etki alanından XMLHttpRequest, istekte bulunmadan önce withCredentials öğesi true olarak ayarlanmadıkça kendi etki alanı için tanımlama bilgisi değerlerini ayarlayamaz.

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

8
Bir Express uygulamasına bağlanmaya çalışıyorsanız, cors kullanmanız ve bu ayarları kullanmanız gerekecektir. Talebin kaynağı gerekli. app.use (cors ({kimlik bilgileri: doğru, kaynak: ' localhost: 8080 '}));
DogCoffee

17
bunun yalnızca Access-Control-Allow-Originyanıtta başlığı joker karaktere (*) ayarlanmadığında çalışacağını unutmayın
Jerry Zhang

1
@JerryZhang Ne demek istiyorsun? Aynı sorunla karşı karşıyayım, eğer Access-Control-Allow-Originayarlanmadıysa *, CORS hakkı nedeniyle o sunucuya talepte bulunmayacağım anlamına geliyor
samayo

5
Yanıt Access-Control-Allow-Origin, XHR talebinde bulunmak istediğiniz etki alanının değerini ayarlamalıdır . örneğin https://a.comsunucudur, https://b.comistemcidir ve https://b.combirinin tarayıcısına yüklenir ve XMLHTTPRequestistek yapmak için kullanır https://a.com. Sunucunun ayarlanması XMLHTTPRequest(başlatılması https://a.com) için ek olarak withCredential: true- https://b.comayrıca yanıt başlığı Access-Control-Allow-Origin: https://a.com
Jerry Zhang

Bununla ilgili küçük bir sorunum var ... İstemci olarak bir sunucu b'ye sahipsem (yani tepki sayfası), bunu true olarak ayarlarsam, a kimlik bilgilerini gönderecek, b kimlik bilgilerini ... LOL. .. Tamam, komik değil.
golddragon007

25

TL; DR:

{ withCredentials: true } veya axios.defaults.withCredentials = true


Axios belgelerinden

withCredentials: false, // default

withCredentials Siteler arası Erişim Kontrolü isteklerinin kimlik bilgileri kullanılarak yapılması gerekip gerekmediğini gösterir

{ withCredentials: true }İsteğiniz ile geçerseniz çalışmalıdır.

Daha iyi bir yol ayarlama olacağını withCredentialsolarak trueiçindeaxios.defaults

axios.defaults.withCredentials = true


5
Her istekte kimlik bilgileri göndermek kötü bir uygulamadır. Bu kontroller bir sebepten dolayı mevcuttur. Başka bir hizmetle konuşmak, tüm çerezlerinizi göndermek - kullanılmasalar da, sömürü için olgunlaşmıştır.
colm.anseo

2
@colminator yalnızca etki alanı olarak sunucu etki alanına sahip çerezler gönderilecektir. (Varsayılan olarak herhangi bir alt etki alanına da gönderilmezler ve yola bağlı olarak daha fazla filtreleme yapılabilir.) Gerçekte, yalnızca sunucu tarafından ayarlanan sunucu çerezlerini gönderiyoruz.
M3RS

15

Axios'a aşina değilim, ancak javascript ve ajax'ta bildiğim kadarıyla bir seçenek var

withCredentials: true

Bu, çerezi otomatik olarak müşteri tarafına gönderecektir. Örnek olarak, bu senaryo, sunucuya bir çerez yerleştiren passportjs ile de oluşturulmuştur.


11

Hızlı yanıtta gerekli başlıkları ayarlamak da önemlidir. Bunlar benim için işe yarayanlar:

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();
});

X-PINGOTHERİçine eklemek Access-Control-Allow-Headersbenim için zorunlu hale geldi (Express 4.16 ile Node.js 6.9, Chrome 63). Kontrol JakeElder bu GitHub konuda 'ın yazı: github.com/axios/axios/issues/191#issuecomment-311069164
Frosty Z'ye


5

Hala çözemeyen insanlar için bu cevap bana yardımcı oldu. stackoverflow yanıt: 34558264

TLDR; sete bir ihtiyacı {withCredentials: true}hem GET isteğinde yanı sıra getirme hem AXIOS için POST isteği (çerez alma).


1
Bu çok önemlidir. Bunu kodumda gözden kaçırmıştım ve { withCredentials: true }GET talebinin neden herhangi bir etkisi olmadığını merak ederek epey vakit geçirdim .
yogmk

1
Son derece önemli! withCredentials: trueİstek yapılandırmasına eklemekle ilgili çok fazla tartışma var , ancak bu ayrıntı değil. Bu sorunla karşılaşana kadar neredeyse 2
günümü

4

Axios'un isteklerde otomatik olarak çerez göndermesini nasıl sağlayabilirim?

Ayarlamak axios.defaults.withCredentials = true;

veya kullanabileceğiniz bazı özel talepler için axios.get(url,{withCredentials:true})

Bu, 'Erişim-Kontrol-İzin-Menşeiniz' joker karaktere (*) ayarlanmışsa CORS hatası verecektir. Bu nedenle talebinizin menşe url'sini belirttiğinizden emin olun

örneğin: isteği localhost: 3000 üzerinde çalıştıran ön ucunuz, yanıt başlığını şu şekilde ayarlayın:

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');

ayrıca ayarla

res.setHeader('Access-Control-Allow-Credentials',true);

3

Yani tam olarak aynı sorunu yaşadım ve hayatımın yaklaşık 6 saatini arayarak kaybettim.

withCredentials: true

Ancak tarayıcı, tuhaf bir nedenden ötürü yapılandırma ayarını karıştırma fikrini bulana kadar çerezi kaydetmedi:

Axios.post(GlobalVariables.API_URL + 'api/login', {
        email,
        password,
        honeyPot
    }, {
        withCredentials: true,
        headers: {'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'
    }});

Görünüşe göre her zaman önce 'withCredentials' Anahtarını göndermelisiniz.


3

withCredentialsİstekte tanımlama bilgilerini iletmek için özelliği kullanabilirsiniz .

axios.get(`api_url`, { withCredentials: true })

Ayarına göre { withCredentials: true }çapraz menşe sorunla karşılaşabilir. Bunu çözmek için kullanmanız gereken

expressApp.use(cors({ credentials: true, origin: "http://localhost:8080" }));

Burada Credentials ile ilgili bilgileri okuyabilirsiniz


2

İki düşünceyi karıştırıyorsunuz.

"React-cookie" ve "axios" a sahipsiniz

react-cookie =>, çerezi istemci tarafında işlemek içindir

axios => sunucuya ajax istekleri göndermek içindir

Bu bilgilerle, istemci tarafındaki çerezlerin arka uç tarafında da iletilmesini istiyorsanız, bunları birbirine bağlamanız gerekecektir.

"React-cookie" Benioku'dan not:

İzomorfik kurabiyeler!

Sunucu oluşturma işlemi sırasında kullanıcı tanımlama bilgilerine erişebilmek için plugToRequest veya setRawCookie'yi kullanabilirsiniz.

benioku bağlantısı

İhtiyacın olan buysa harika.

Değilse, daha fazla ayrıntı verebilmem için lütfen yorum yapın.


plugToRequestTam olarak ne yapar ? Düğüm sunucusundaki tanımlama bilgilerine erişmeyi düşündüm, tek gereken cookie-parserara yazılım mı (Express varsayarsak)?
geoboy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.