Çerez ile API getir


201

Yeni Getirme API'sini deniyorum ama Çerezler ile sorun yaşıyorum. Özellikle, başarılı bir girişten sonra gelecekteki isteklerde bir Çerez başlığı var, ancak Fetch bu başlıkları yok sayıyor gibi görünüyor ve Fetch ile yapılan tüm isteklerim yetkisiz.

Getir hala hazır olmadığından veya Getir Çerezlerle çalışmadığı için mi?

Uygulamamı Webpack ile oluşturuyorum. Aynı sorunu olmayan React Native'de Getir'i de kullanıyorum.

Yanıtlar:


280

Getirme varsayılan olarak çerez kullanmaz. Çerezi etkinleştirmek için şunu yapın:

fetch(url, {
  credentials: "same-origin"
}).then(...).catch(...);

55
aynı kökenli artık çalışmıyor, şunları içeriyor (@ @ Jerry'nin cevabına bakın): developers.google.com/web/updates/2015/03/introduction-to-fetch
jpic

7
@jpic: 'include' yalnızca çapraz kökenli isteklerde çalışır, aynı kökenli isteklerde çalışmaz. Resmi dokümanlar: github.com/github/fetch#sending-cookies
HoldOffHunger

O zaman getirme ile js okunabilir ise httponly çerezleri için nedeni nedir?
Martin Bajcar

4
İnanıyorum same-origin(ki does daha başlıklar (çerezler, vs.) uyulacaktır ancak kod yanıtı sınırlı erişim olacağı hala işi) anlamına gelir.
Coderer

2
@JohnBalvinAriasThx. Daha sonra anladığım gibi, çerez httponly olması, okunabilir olmadığı document.cookie, ancak hala ajax veya getirme istekleri için kullanılabilir olduğu anlamına gelir .
Martin Bajcar

186

@ Khanetor'un cevabına ek olarak, çapraz kökenli taleplerle çalışanlar için: credentials: 'include'

Örnek JSON getirme isteği:

fetch(url, {
  method: 'GET',
  credentials: 'include'
})
  .then((response) => response.json())
  .then((json) => {
    console.log('Gotcha');
  }).catch((err) => {
    console.log(err);
});

https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials


9
kurabiyeyi nasıl ayarlarsın?
pomo

2
Çerez, sunucu tarafından ayarlanır. Benim durumumda httponly çerezleri kullanıyordum.
Khanetor

3
@Khanetor javascript ile document.cookie'yi kullanarak çerezleri ayarlayabilir ve daha sonra isteği gönderebilir miyim?
ospider

@ospider Başlıkta gönderebilirsiniz.
10101010

2
@ospider Sadece değeri ayarlamanın document.cookieisteklere dahil edilmesi için yeterli olduğunu gördüm .
skwidbreth

36

Sadece çözdüm. Sadece iki f. Brutforce günleri

Benim için sır şu şekildeydi:

  1. POST / api / auth'u aradım ve çerezlerin başarıyla alındığını gördüm.

  2. Daha sonra GET / api / users / ile credentials: 'include'çağrılıyor ve istek ile çerez gönderilmediği için 401 yetkisi yok.

ANAHTAR credentials: 'include'ilk /api/authçağrı için de ayarlamaktır .


1
Senin sorunun tam olarak bende. Oturum çerezi asla GET veri isteğinde gönderilmez. 401. Axios ve Fetch'i denedim. aynı sonuç. 2 olasılık: Giriş
POST'si

@ Rhubarb65, bu u kazanmak credentials: 'include'için ilk belirtmelisinizPOST /api/auth
user1671599

Evet, bende vardı ama yeterince istiyor.
Devserver

Evet, kimlik bilgilerim vardı ama yeterli değildi. Ben CORS geçmiş almak için bir devserver proxy kullanıyordum: (istemci http) - proxy - (sunucu https). Bunun güvenli çerezler https gerektirdiğinden sunucudaki sessionid çerezinin tarayıcıda ayarlanmadığı anlamına geldiğine inanıyorum. Ben devserver proxy'de https: true bayrağını ekledim ve bu
sorunu

1
Şerefe. Cevabınız bana sadece 1 gün bruteforce sürmesi anlamına geliyordu. :)
Michael

16

Bunu 2019'da okuyorsanız credentials: "same-origin", varsayılan değerdir.

fetch(url).then

1
Ancak, herkesin yeterince güncellenmiş bir tarayıcı kullanmadığını unutmayın. Bu soruyla karşılaştım çünkü kendi Firefox sürümüm (60.x, Debian Stretch'in en yenisi) bunu varsayılan olarak ayarlamadı.
philh

2

.net webapi2Kullanıcılar için burada doğru cevapları eklemeniz yeterli .

corsİstemci siteniz sizin adresiniz gibi farklı bir adresten sunulduğu için kullanıyorsanız , sunucu tarafı yapılandırmasına webapida eklemeniz gerekir SupportsCredentials=true.

        // Access-Control-Allow-Origin
        // https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
        var cors = new EnableCorsAttribute(Settings.CORSSites,"*", "*");
        cors.SupportsCredentials = true;
        config.EnableCors(cors);

0

Bu benim için çalışıyor:

import Cookies from 'universal-cookie';
const cookies = new Cookies();

function headers(set_cookie=false) {
  let headers = {
    'Accept':       'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
};
if (set_cookie) {
    headers['Authorization'] = "Bearer " + cookies.get('remember_user_token');
}
return headers;
}

Ardından çağrınızı oluşturun:

export function fetchTests(user_id) {
  return function (dispatch) {
   let data = {
    method:      'POST',
    credentials: 'same-origin',
    mode:        'same-origin',
    body:        JSON.stringify({
                     user_id: user_id
                }),
    headers:     headers(true)
   };
   return fetch('/api/v1/tests/listing/', data)
      .then(response => response.json())
      .then(json => dispatch(receiveTests(json)));
    };
  }
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.