Axios ile yetkilendirme başlığı nasıl gönderilir


99

Axios.js aracılığıyla bir belirteç içeren bir kimlik doğrulama başlığını nasıl gönderebilirim? Başarı olmadan birkaç şey denedim, örneğin:

const header = `Authorization: Bearer ${token}`;
return axios.get(URLConstants.USER_URL, { headers: { header } });

Bana şu hatayı veriyor:

XMLHttpRequest cannot load http://localhost:8000/accounts/user/. Request header field header is not allowed by Access-Control-Allow-Headers in preflight response.

Global varsayılanı ayarlayarak çalışmasını sağlamayı başardım, ancak bunun tek bir istek için en iyi fikir olmadığını tahmin ediyorum:

axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

Güncelleme :

Cole'un cevabı sorunu bulmama yardımcı oldu. Yetkilendirme başlığını varsayılan olarak zaten işleyen django-cors-headers ara yazılımını kullanıyorum .

Ancak hata mesajını anlayabildim ve axios istek kodumdaki bir hatayı düzelttim, bu şuna benzer

return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });

Yanıtlar:


89

Basit olmayan http isteklerinde tarayıcınız, söz konusu sitenin hangi bilgilerin gönderilmesi için güvenli olduğunu belirlemek için ilk olarak bir "ön kontrol" isteği (SEÇENEKLER yöntemi isteği) gönderecektir ( bununla ilgili çapraz kaynak politika spesifikasyonu için buraya bakın ). Ev sahibinin ön kontrol yanıtında ayarlayabileceği ilgili başlıklardan biri Access-Control-Allow-Headers. Göndermek istediğiniz başlıklardan herhangi biri, spesifikasyonun beyaz listedeki başlıklar listesinde veya sunucunun ön kontrol yanıtında listelenmemişse, tarayıcı isteğinizi göndermeyi reddeder.

Sizin durumunuzda, Authorizationevrensel olarak başlık göndermek için güvenli sayılmayan bir başlık göndermeye çalışıyorsunuz . Tarayıcı daha sonra sunucuya bu başlığı gönderip göndermeyeceğini sormak için bir ön kontrol isteği gönderir. Sunucu ya boş bir Access-Control-Allow-Headersbaşlık gönderiyor ("fazladan başlığa izin verme" anlamına gelir) veya Authorizationizin verilen üstbilgiler listesinde bulunmayan bir başlık gönderiyor . Bu nedenle, tarayıcı isteğinizi göndermeyecek ve bunun yerine bir hata atarak sizi bilgilendirmeyi seçecektir.

Bu isteği göndermenize izin veren bulduğunuz herhangi bir Javascript geçici çözümü, tarayıcınızın kendi güvenliğiniz için uygulamaya çalıştığı çapraz kaynak talebi politikasına aykırı olduğu için bir hata olarak değerlendirilmelidir.

tl; dr -AuthorizationBaşlıklargöndermek istiyorsanız, sunucunuz buna izin verecek şekilde yapılandırılmış olmalıdır. Sunucunuzu, o url'deki birOPTIONSisteğe birAccess-Control-Allow-Headers: Authorizationbaşlıkileyanıt verecek şekilde ayarlayın.


12
Teşekkür ederim Cole! Cevabınız sorunu bulmama yardımcı oldu. Yetkilendirme başlığını varsayılan olarak zaten işleyen django-cors-headers ara yazılımını kullanıyorum. Ancak hata mesajını anlayabildim ve axios istek kodumdaki bir hatayı düzelttim, bu şuna benzer return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });
foobar

1
Rica ederim! API'lerimle her zaman bu tür sorunlarla karşılaşıyorum. Geçmesi gereken süreci anlamanıza yardımcı olabildiğime sevindim.
Cole Erickson

44

Bunu dene :

axios.get(
    url,
    {headers: {
        "name" : "value"
      }
    }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

1
Yani başlık adı 'Access-Control-Allow-Headers' olacaktır ve değer istediğiniz şeydir.
Matija Župančić

Yani, şu şekilde bir şeye sahip olacağımı mı söylüyorsunuz: axios.get (url, {headers: {'Access-Control-Allow-Headers': 'Bearer <my token>'}})? Bu işe yaramıyor.
foobar

11
{'Yetkilendirme': 'Taşıyıcı <simgem>'} olması gerektiğine inanıyorum
John Harding

38

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

let webApiUrl = 'example.com/getStuff';
let tokenStr = 'xxyyzz';
axios.get(webApiUrl, { headers: {"Authorization" : `Bearer ${tokenStr}`} });

2
Yukarıdakilere kıyasla yanıtta daha az ayrıntı var, ancak bu herkesin google'da arama yaparken aradığı yanıt bu.
Black Mamba

35

Her isteğe eklemek yerine, bunu varsayılan bir yapılandırma olarak ekleyebilirsiniz.

axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` 

bu konfigürasyonu nasıl yerleştirirsiniz? kökte (index.js, App.js)? Veya ayrı bir dosyada?
ibubi

8

Neredeyse haklısınız, sadece kodunuzu bu şekilde ayarlayın

const headers = { Authorization: `Bearer ${token}` };
return axios.get(URLConstants.USER_URL, { headers });

Backticks nereye yerleştirdiğime dikkat edin, '' Bearer'dan sonra ekledim, sunucu tarafında işlem yapacağınızdan emin olursanız atlayabilirsiniz.


6
Normalde (spesifikasyona göre) -, kimlik doğrulama şeması ile simge arasında tire ( ) değil, boşluk vardır . Gösterdiğiniz gibi herhangi bir sunucu türünün kısa çizgi gerektirdiğini hiç görmedim ve çoğu olmasa da çoğu bir hata sağlanmışsa bir hata gönderir.
Raman

6

Axios.get işlevini çağırmak yerine şunu kullanın:

axios({ method: 'get', url: 'your URL', headers: { Authorization: `Bearer ${token}` } })

1

Bunu deneyebilirsin.

axios.get(
    url,
    {headers: {
            "Access-Control-Allow-Origin" : "*",
            "Content-type": "Application/json",
            "Authorization": `Bearer ${your-token}`
            }   
        }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

0
res.setHeader('Access-Control-Allow-Headers',
            'Access-Control-Allow-Headers, Origin,OPTIONS,Accept,Authorization, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');

Blok alıntı: setHeader () öğesine SEÇENEKLER ve Yetki eklemeniz gerekir

bu değişiklik sorunumu çözdü, bir deneyin!


0

Ara corsyazılımı yükleyin . Kendi kodumuzla çözmeye çalışıyorduk, ancak tüm girişimler sefil bir şekilde başarısız oldu.

Bu, çalışmasını sağladı:

cors = require('cors')
app.use(cors());

Orijinal bağlantı


1
bu düğüm sunucuları içindir, aksiyolar için değil
Marc Garcia

Bu soruyu bulan kullanıcılar bu yanıtı faydalı bulabilir. Bu soru, kullanım durumlarında düğüm sunucuları ile çalışmak için kullanılabilir ve cors'un sorunlarını çözebileceğini veya arka uç başlık kontrolünü yukarıdaki kodun altına taşıyabileceğini hatırlatmak için kullanılabilir. Beni çok fazla hayal kırıklığından kurtarmaya yardımcı oldu, Teşekkürler zil-zil
DORRITO
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.