Taşıyıcı belirtecini axios ile gönderme


120

React uygulamamda REST api isteklerini gerçekleştirmek için axios kullanıyorum .

Ancak , istekle birlikte Yetkilendirme başlığını gönderemez .

İşte kodum:

tokenPayload() {
  let config = {
    headers: {
      'Authorization': 'Bearer ' + validToken()
    }
  }
  Axios.post( 
      'http://localhost:8000/api/v1/get_token_payloads',
      config
    )
    .then( ( response ) => {
      console.log( response )
    } )
    .catch()
}

Burada validToken()yöntem, jetonu tarayıcı deposundan döndürür.

Tüm isteklerde 500 hata yanıtı var.

Jeton, istekten ayrıştırılamadı

arka uçtan.

Yetkilendirme başlığı her talepte nasıl gönderilir? React özelliğine sahip başka bir modül önerir misiniz?


Bunun bir axiossorun olduğunu sanmıyorum . validToken()işlevinizi kontrol edin , sunucunuzun anlamadığı bir şey döndürür.
xiaofan2406

İşlevi iki kez kontrol ettim ve işlev yerine buradaki simge dizesini de kullandım, hala aynı
rakibtg

Yanıtlar:


145
const config = {
    headers: { Authorization: `Bearer ${token}` }
};

const bodyParameters = {
   key: "value"
};

Axios.post( 
  'http://localhost:8000/api/v1/get_token_payloads',
  bodyParameters,
  config
).then(console.log).catch(console.log);

İlk parametre URL'dir.
İkincisi, isteğinizle birlikte gönderilecek JSON gövdesidir.
Üçüncü parametre başlıklardır (diğer şeylerin yanı sıra). Bu da JSON.


4
Taşıyıcı ve jeton arasındaki boşluğu kaçırdınız - o zaman işe yarayacak.
Aralık

Doktorun gönderisi: "key:" value "kaldırılması gereken bir alıntı içeriyor ... Ancak bu düzeltme, yetkilendirmeyi react-native uygulamam için işe
yaradı

1
@mediaguru Thx yorum için. Düzelttim (sanırım)! Alıntı, cevabı düzenleyen biri tarafından tanıtılmış olmalı ...
Doctor

2
Bearerbüyük B ile kullanılmalı, değil mi?
Alizadeh118

1
@ Alizadeh118 Evet, HTTP özelliklerine göre. Ancak birçok API, doğru büyük harf kullanımı konusunda ısrarcı değil.
OneHoopyFrood

64

İşte aksiyolarda Yetkilendirme belirtecini ayarlamanın benzersiz bir yolu. Yapılandırmayı her axios çağrısına ayarlamak iyi bir fikir değildir ve varsayılan Yetkilendirme jetonunu şu şekilde değiştirebilirsiniz:

import axios from 'axios';
axios.defaults.baseURL = 'http://localhost:1010/'
axios.defaults.headers.common = {'Authorization': `bearer ${token}`}
export default axios;

Düzenle , Jason Norwood-Young'a teşekkürler.

Bazı API, taşıyıcının Taşıyıcı olarak yazılmasını gerektirir, böylece şunları yapabilirsiniz:

axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}

Artık her API çağrısı için yapılandırma ayarlamanıza gerek yok. Artık Yetkilendirme belirteci her axios çağrısına ayarlanmıştır.


18
Bearerbazı API'ler için büyük harfle yazılması gerekiyor (Zor yolu keşfettim).
Jason Norwood-Young


24

Yapılandırmayı bir kez oluşturabilir ve her yerde kullanabilirsiniz.

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'Authorization': 'Bearer '+token}
});

instance.get('/path')
.then(response => {
    return response.data;
})

Bu örnekte jetonun değeri nereden aktarılır? Başvurum için, başarılı bir oturum açtıktan sonra jeton başlıkta veya gövdede api'ye geri aktarılacaktı.
Ken

buradaheaders: {'Authorization': 'Bearer '+token}
M.suleman Khan

POST
isteğiyse

Jetonun değerinin nereden aktarılabileceğini merak edenler için, işte es6 sözdizimi -const instance = (token) => axios.create({ baseURL: `${config.API_URL}`, timeout: 1000, headers :{ 'authorization': 'Bearer ' + token } })
Jeet

19

Axios önleyiciyi kullanarak:

const service = axios.create({
  timeout: 20000 // request timeout
});

// request interceptor

service.interceptors.request.use(
  config => {
    // Do something before request is sent

    config.headers["Authorization"] = "bearer " + getToken();
    return config;
  },
  error => {
    Promise.reject(error);
  }
);

1
Başlıkları aksiyolarla yapılandırmak için topluluk standardı bu mu?
5ervant

@ 5ervant Bu yaklaşımı kullanırken gerçekten çirkin bir zaman geçirdim. Çok acı çekti ve ben de tavsiye etmiyorum.
ankush981

@ ankush981 Bu yaklaşımla ilgili bu kadar kötü olan nedir ve hangisini önerirsiniz?
Nenad Kaevik

1
@NenadKaevik Örtmeye çalıştığım özel bir kullanım durumu var (yanıt müdahalesi): sunucu yanıt olarak 403 dediğinde kullanıcıya haber vermek. İnsanlar genellikle jeton doğrulama adımını bileşen yükleme sırasında koyarlar, ancak jetonunuzun doğrulandıktan birkaç saniye sonra (herhangi bir nedenle) geçersiz kılındığını varsayalım. Şimdi kişi bir düğmeyi tıkladığında, oturumu kapatıldığını bilmesini istiyorum. Global davranış ekledikleri için bunu önleyicileri kullanarak yapmak zor.
Yeniden

@NenadKaevik Yani, belki akışı başarmak zordu ya da yanlış yaklaşımı kullanıyordum, ama o zamandan beri önleyicilerden nefret etmeye başladım.
ankush981

9

Başlığa belirteç ilettikten sonra bazı veriler istiyorsanız, bu kodu deneyin

const api = 'your api'; 
const token = JSON.parse(sessionStorage.getItem('data'));
const token = user.data.id; /*take only token and save in token variable*/
axios.get(api , { headers: {"Authorization" : `Bearer ${token}`} })
.then(res => {
console.log(res.data);
.catch((error) => {
  console.log(error)
});

2

Bu işe yarıyor ve jetonu şu öğemde yalnızca bir kez ayarlamam gerekiyor app.js:

axios.defaults.headers.common = {
    'Authorization': 'Bearer ' + token
};

Daha sonra üstbilgiyi yeniden ayarlamadan bileşenlerimde istekte bulunabiliyorum.

"axios": "^0.19.0",


Nedenini bilmiyorum ama bu şekilde iOS cihazda Safari'de çalışmıyor :(
ZecKa

0

axioskendi başına iki kullanışlı "yöntem" ile birlikte gelir interceptors; bunlar, istek ve yanıt arasında hiçbir ortak yazılım değildir. bu nedenle, her istekte belirteci göndermek istiyorsanız. Kullanın interceptor.request.

Size yardımcı olacak bir paket hazırladım:

$ npm i axios-es6-class

Artık axios'u sınıf olarak kullanabilirsiniz

export class UserApi extends Api {
    constructor (config) {
        super(config);

        // this middleware is been called right before the http request is made.
        this.interceptors.request.use(param => {
            return {
                ...param,
                defaults: {
                    headers: {
                        ...param.headers,
                        "Authorization": `Bearer ${this.getToken()}`
                    },
                }
            }
        });

      this.login = this.login.bind(this);
      this.getSome = this.getSome.bind(this);
   }

   login (credentials) {
      return this.post("/end-point", {...credentials})
      .then(response => this.setToken(response.data))
      .catch(this.error);
   }


   getSome () {
      return this.get("/end-point")
      .then(this.success)
      .catch(this.error);
   }
}

Demek istediğim, uygulama middlewaresize bağlıdır veya kendi axios-es6-class https://medium.com/@enetoOlveda/how-to-use-axios-typescript-like-a-pro-7c882f71e34a'nızı oluşturmayı tercih ederseniz , bu ortamdır geldiği yere gönder


-4

Bu benim de karşılaştığım şey. Gönderdiğiniz jeton doğru değil.

Sadece jetonu sabit kodlayın ve geçin, doğru yanıtı alacaksınız. Ancak belirteç tek alıntıda iletilmezse '', o zaman kesinlikle başarısız olacaktır. 'Yetkilendirme' biçiminde olmalıdır: 'Taşıyıcı YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ', burada da Taşıyıcıdan sonra tek tırnak içinde çok önemlidir.

var token = "YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ";

var headers = {
  Authorization: "Bearer " + token,
  Accept: "application/json, text/plain, */*",
  "Content-Type": "application/json"
};

IMP: Yukarıdaki kod işe yarayacaktır. Ancak şöyle bir şey gönderirseniz:

'Yetkilendirme': 'Taşıyıcı' + YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ, başarısız olacak

veya ----- aşağıdaki kod da başarısız olur, umarım temel farkı anlıyorsunuz

var token = YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjA0YmEzZmZjN2I1MmI4MDJkNQ;

var headers = {
  Authorization: "Bearer " + token,
  Accept: "application/json, text/plain, */*",
  "Content-Type": "application/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.