Axios отримує доступ до полів заголовка відповідей


160

Я будую додаток для інтерфейсів з React і Redux, і я використовую axios для виконання своїх запитів. Я хотів би отримати доступ до всіх полів у заголовку відповіді. У своєму браузері я можу оглянути заголовок, і я бачу, що всі потрібні мені поля є (наприклад, маркер, uid тощо), але коли я дзвоню

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

Я отримую просто

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

Ось моя вкладка мережі браузера, як ви можете бачити всі інші поля.

введіть тут опис зображення

Звірі.


Якщо ви надрукуєте axios.defaults.headers, це дає вам будь-який з тих, хто вам не вистачає? Деякі заголовки налаштовані на цьому рівні, а не на кожному запиті (див. Github.com/mzabriskie/axios#global-axios-defaults )
Бен Харе

2
Хіба це не axios.defaults.headersдля налаштування параметрів заголовка REQUEST? Мені потрібно отримати доступ до відгуку. @BenHare
TWONEKSONE

BTW, те, що ви назвали запитом, не є запитом. Це обіцянка для вашої відповіді. Ваш запит - це те, що ви передали методу post () як аргументи.
Даніель

Відповіді:


311

У випадку запитів CORS браузери можуть мати доступ до таких заголовків відповідей лише за замовчуванням:

  • Кеш-контроль
  • Мова вмісту
  • Тип вмісту
  • Закінчується
  • Остання зміна
  • Прагма

Якщо ви хочете, щоб ваш клієнтський додаток мав доступ до інших заголовків, вам потрібно встановити заголовок Access-Control-Expose-Headers на сервері:

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

Моє погане, що я забув виставити ці поля.
TWONEKSONE

27
Якщо ви використовуєте Rails з Rack-Cors, вам потрібно встановити expose: ['Access-Token', 'Uid']джерело типу:resource '*', :headers => :any, :methods => [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Access-Token', 'Uid']
CWitty

3
Я не розумію. Якщо вони не відкриті, чому додаткові заголовки видно у браузері, але не у відповіді axios?
аданілев

4
@adanilev, веб-переглядачі дозволяють бачити їх з метою налагодження, але не дозволяють вам отримувати доступ до них через API з міркувань безпеки. Це заважає клієнтам отримувати захищені облікові дані від серверів, що дозволяє серверу визначити, який доступ має клієнт. TLDR: це зроблено спеціально для безпеки
пошкодження

2
У мене це є у моєму файлі конфігурацій NGINX ... 'Access-Control-Expose-Headers' 'Authorization, X-Suggested-Filename, content-disposition' always; Ще бачити content-type: "application/pdf" справді потрібно лише тягнутиcontent-disposition
Old Man Walter

17

Це мені дуже допомогло, дякую Ніку Уральцеву за вашу відповідь.

Для тих з вас , використовуючи nodejs з CORS :

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

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

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

У випадку, коли ви надсилаєте відповідь способом res.header('Authorization', `Bearer ${token}`).send();


1
Для тих, хто цікавиться, ви можете також пропустити масив і тут: izpostavHeaders: ['Авторизація', 'X-Total-Count']
Thiago Santana,

11

Я зіткнувся з тією ж проблемою. Y зробив це в моєму "WebSecurity.java", мова йде про метод setExposedHeaders в конфігурації 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;
}

Сподіваюся, це спрацює.


7

Зіткнувся з тією ж проблемою в ядрі asp.net Сподіваюся, що це допомагає

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

1
Ласкаво просимо до SO! Ваша відповідь може бути правильною, але в StackOverflow не рекомендується розміщувати лише відповідь. Спробуйте надати пояснення, як ваша відповідь вирішує оригінальне запитання. будь ласка, прочитайте це про те, як написати кращу відповідь
nircraft

Дякую, це допомогло;)
Флоріан

2

Згідно з офіційними документами :

Це може допомогти, якщо ви хочете заголовки HTTP, на які відповів сервер . Усі назви заголовків мають нижній облік і можуть бути доступні за допомогою позначення дужок. Приклад: response.headers['content-type']дасть щось на зразок: headers: {},


1

Для SpringBoot2 просто додайте

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

до коду вашої реалізації фільтра CORS, щоб він був дозволений custom-header1та custom-header2ін



0

Для Spring Boot 2, якщо ви не хочете використовувати глобальну конфігурацію CORS, ви можете це зробити за методом або рівнем класу / контролера, використовуючи @CrossOriginрекламу з атрибутом exposedHeaders.

Наприклад, для додавання заголовка authorizationдля YourControllerметодів:

@CrossOrigin(exposedHeaders = "authorization")
@RestController
public class YourController {
    ...
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.