Gli assi hanno accesso ai campi di intestazione della risposta


160

Sto costruendo un'app frontend con React e Redux e sto usando axios per eseguire le mie richieste. Vorrei avere accesso a tutti i campi nell'intestazione della risposta. Nel mio browser posso controllare l'intestazione e posso vedere che tutti i campi di cui ho bisogno sono presenti (come token, uid, ecc ...), ma quando chiamo

const request = axios.post(`${ROOT_URL}/auth/sign_in`, props);
request.then((response)=>{
  console.log(response.headers);
});

Ho appena

Object {content-type: "application/json; charset=utf-8", cache-control: "max-age=0, private, must-revalidate"}

Qui la mia scheda di rete del browser, come puoi vedere tutti gli altri campi sono presenti.

inserisci qui la descrizione dell'immagine

Bests.


Se stampi axios.defaults.headers ti dà qualcuno di quello che ti manca? Alcune intestazioni sono configurate a quel livello, non a quello di ogni richiesta (vedi github.com/mzabriskie/axios#global-axios-defaults )
Ben Hare,

2
Non è axios.defaults.headersper configurare i parametri dell'intestazione REQUEST? Devo accedere a quello RISPOSTA. @BenHare
TWONEKSONE,

A proposito, ciò che hai chiamato richiesta, non è una richiesta. È una promessa per la tua risposta. La tua richiesta è stata quella che hai passato al metodo post () come argomenti.
Daniel,

Risposte:


311

In caso di richieste CORS, i browser possono accedere alle seguenti intestazioni di risposta solo per impostazione predefinita:

  • Cache-Control
  • Content-Language
  • Tipo di contenuto
  • Scade
  • Ultima modifica
  • Pragma

Se desideri che la tua app client sia in grado di accedere ad altre intestazioni, devi impostare l'intestazione Access-Control-Expose-Headers sul server:

Access-Control-Expose-Headers: Access-Token, Uid

Mio male, ho dimenticato di esporre quei campi.
TWONEKSONE,

27
Se si utilizza Rails con Rack-Cors, è necessario impostare expose: ['Access-Token', 'Uid']l'origine come:resource '*', :headers => :any, :methods => [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Access-Token', 'Uid']
CWitty

3
Non capisco Se non sono esposti, perché le intestazioni aggiuntive sono visibili nel browser ma non nella risposta degli assi?
adanilev,

4
@adanilev, i browser ti consentono di vederli per scopi di debug, ma ti impediscono di accedervi attraverso le API per motivi di sicurezza. Impedisce ai client di ottenere credenziali protette dai server, consentendo al server di determinare quale accesso ha un client. TLDR: è fatto apposta per la sicurezza
erpling il

2
Ho questo nel mio file confg NGINX ... 'Access-Control-Expose-Headers' 'Authorization, X-Suggested-Filename, content-disposition' always; vedo ancora solo content-type: "application/pdf" bisogno di tirarecontent-disposition
Old Man Walter,

17

Questo mi ha davvero aiutato, grazie Nick Uraltsev per la tua risposta.

Per quelli di voi che usano nodejs con cors :

...
const cors = require('cors');

const corsOptions = {
  exposedHeaders: 'Authorization',
};

app.use(cors(corsOptions));
...

Nel caso in cui si stia inviando la risposta res.header('Authorization', `Bearer ${token}`).send();


1
Per quelli che si chiedono, potresti passare anche un array qui: exposHeaders: ['Authorization', 'X-Total-Count']
Thiago Santana

11

Stavo affrontando lo stesso problema. Lo hai fatto nel mio "WebSecurity.java", riguarda il metodo setExposedHeaders nella configurazione cors.

@Bean
CorsConfigurationSource corsConfigurationSource() {

    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.setAllowedOrigins(Arrays.asList(FRONT_END_SERVER));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
    configuration.setAllowedHeaders(Arrays.asList("X-Requested-With","Origin","Content-Type","Accept","Authorization"));

    // This allow us to expose the headers
    configuration.setExposedHeaders(Arrays.asList("Access-Control-Allow-Headers", "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
            "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

Spero che funzioni.


7

Di fronte allo stesso problema nel nucleo di asp.net Spero che questo aiuti

public static class CorsConfig
{
    public static void AddCorsConfig(this IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder
                .WithExposedHeaders("X-Pagination")
                );
        });
    }
}

1
Benvenuti in SO! La tua risposta potrebbe essere corretta ma su StackOverflow è sconsigliato inviare solo la risposta del codice. Prova a fornire una spiegazione di come la tua risposta risolve la domanda originale. per favore leggi questo su come scrivere una risposta migliore
nircraft

Grazie, mi ha aiutato;)
Florian,

2

Secondo i documenti ufficiali :

Ciò può essere utile se si desidera che le intestazioni HTTP con cui il server ha risposto . Tutti i nomi delle intestazioni sono in maiuscolo e sono accessibili utilizzando la notazione parentesi. Esempio: response.headers['content-type']darà qualcosa come: headers: {},


1

Per lo SpringBoot2 basta aggiungere

httpResponse.setHeader("Access-Control-Expose-Headers", "custom-header1, custom-header2");

al codice di implementazione del filtro CORS da inserire nella whitelist custom-header1e custom-header2così via



0

Per Spring Boot 2 se non si desidera utilizzare la configurazione CORS globale, è possibile farlo in base al metodo o al livello di classe / controller utilizzando l' @CrossOriginannotazione con attributo exposedHeaders.

Ad esempio, per aggiungere un'intestazione authorizationper i YourControllermetodi:

@CrossOrigin(exposedHeaders = "authorization")
@RestController
public class YourController {
    ...
}
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.