Invio del gettone al portatore con axios


118

Nella mia app React sto usando axios per eseguire le richieste API REST.

Ma non è in grado di inviare l' intestazione di autorizzazione con la richiesta.

Ecco il mio codice:

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

Qui il validToken()metodo restituirebbe semplicemente il token dalla memoria del browser.

Tutte le richieste hanno una risposta di errore 500 che lo dice

Il token non può essere analizzato dalla richiesta

dal back-end.

Come inviare l'intestazione dell'autorizzazione con ciascuna richiesta? Consiglieresti un altro modulo con React?


Non credo sia affatto un axiosproblema. controlla la tua validToken()funzione, restituisce qualcosa che il tuo server non comprende.
xiaofan2406

Ho ricontrollato la funzione e ho anche usato la stringa del token qui invece della funzione, sempre la stessa
rakibtg

Risposte:


140
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);

Il primo parametro è l'URL.
Il secondo è il corpo JSON che verrà inviato insieme alla tua richiesta.
Il terzo parametro sono le intestazioni (tra le altre cose). Che è anche JSON.


4
Hai perso uno spazio tra portatore e gettone, allora funzionerà.
dicembre

Il post del dottore: "chiave:" valore "contiene una citazione che dovrebbe essere rimossa ... Ma la correzione ha consentito all'autenticazione di funzionare per la mia app nativa di reazione.
mediaguru

1
@mediaguru Thx per il commento. L'ho risolto (suppongo)! La citazione deve essere stata introdotta da qualcuno che ha modificato la risposta ...
Dottore

2
Bearerdovrebbe essere usato con la B maiuscola, no?
Alizadeh118

1
@ Alizadeh118 Sì, secondo le specifiche HTTP. Ma molte API non insistono sulla corretta capitalizzazione.
OneHoopyFrood

60

Ecco un modo unico per impostare il token di autorizzazione in axios. L'impostazione della configurazione per ogni chiamata axios non è una buona idea e puoi modificare il token di autorizzazione predefinito:

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

Modifica , grazie a Jason Norwood-Young.

Alcune API richiedono che il portatore sia scritto come Portatore, quindi puoi fare:

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

Ora non è necessario impostare la configurazione per ogni chiamata API. Ora il token di autorizzazione è impostato su ogni chiamata axios.


18
Bearerdeve essere capitalizzato per alcune API (l'ho scoperto nel modo più duro).
Jason Norwood-Young


23

Puoi creare la configurazione una volta e usarla ovunque.

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

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

Da dove viene passato il valore del token in questo esempio? Per la mia applicazione, il token verrebbe restituito all'api nell'intestazione o nel corpo dopo un accesso riuscito.
Ken

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

Come passare i dati se si tratta di una richiesta POST
M.suleman Khan

Per coloro che si stanno chiedendo da dove possa essere passato il valore del token, ecco la sintassi es6 -const instance = (token) => axios.create({ baseURL: `${config.API_URL}`, timeout: 1000, headers :{ 'authorization': 'Bearer ' + token } })
Jeet

18

Utilizzando Axios Interceptor:

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
È questo lo standard della comunità per la configurazione delle intestazioni con gli assi?
servo

@ 5ervant Ho passato dei brutti momenti usando questo approccio. È stato molto doloroso e quindi non lo consiglio.
ankush981

@ ankush981 cosa c'è di così negativo in questo approccio e quale consiglieresti?
Nenad Kaevik

1
@NenadKaevik C'è un caso d'uso particolare che stavo cercando di coprire (intercettazione della risposta): far sapere all'utente quando il server dice 403 in risposta. Le persone generalmente inseriscono il passaggio di verifica del token durante il caricamento del componente, ma supponiamo che il tuo token sia stato invalidato pochi secondi dopo essere stato verificato (per qualsiasi motivo). Ora, quando la persona fa clic su un pulsante, vorrei che sapesse di essere stata scollegata. È difficile farlo utilizzando gli intercettori poiché aggiungono un comportamento globale. Sono entrato in un ciclo di ricarica perché l'intercettatore di richieste aggiungeva sempre il token e l'intercettore di risposta reindirizzava
ankush981

@NenadKaevik Quindi, forse il flusso era difficile da raggiungere o stavo usando l'approccio sbagliato, ma da allora ho iniziato a odiare gli intercettori.
ankush981

9

Se vuoi alcuni dati dopo aver passato il token nell'intestazione, prova questo codice

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

Funziona e devo impostare il token solo una volta nel mio app.js:

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

Quindi posso effettuare richieste nei miei componenti senza impostare nuovamente l'intestazione.

"axios": "^0.19.0",


Non so perché ma in questo modo non funziona su Safari su dispositivo iOS :(
ZecKa

0

axiosdi per sé viene fornito con due utili "metodi" interceptorsche non sono altro che middleware tra la richiesta e la risposta. quindi se ad ogni richiesta vuoi inviare il token. Usa il interceptor.request.

Ho fatto un pacchetto che ti aiuta:

$ npm i axios-es6-class

Ora puoi usare axios come classe

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

Voglio dire che l'implementazione del middlewaredipende da te, o se preferisci creare il tuo axios-es6-class https://medium.com/@enetoOlveda/how-to-use-axios-typescript-like-a-pro-7c882f71e34a è il mezzo post da dove proviene


-4

Questo è quello che ho anche affrontato. Il token che stai passando non è corretto.

Basta hardcodificare il token e passare, otterrai la risposta corretta. Ma se il token non viene passato tra virgolette singole '', allora sicuramente fallirà. Deve essere in formato "Autorizzazione": "Bearer YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ", dove dopo Bearer deve essere presente uno spazio, anch'esso molto importante all'interno di virgolette singole.

var token = "YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ";

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

IMP: il codice sopra funzionerà ma se pubblichi qualcosa come:

"Autorizzazione": "Portatore" + YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ, non funzionerà

o ----- anche il codice seguente fallirà, spero che tu capisca la differenza di base

var token = YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjA0YmEzZmZjN2I1MmI4MDJkNQ;

var headers = {
  Authorization: "Bearer " + token,
  Accept: "application/json, text/plain, */*",
  "Content-Type": "application/json"
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.