Axios получают доступ к полям заголовка ответа

Я создаю интерфейсное приложение с 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"}

Здесь моя вкладка сети браузера, как вы можете видеть, присутствуют все остальные поля.

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

Лучшие.


person TWONEKSONE    schedule 18.06.2016    source источник
comment
Если вы распечатаете axios.defaults.headers, вы получите что-нибудь из того, что вам не хватает? Некоторые заголовки настраиваются на этом уровне, а не на уровне каждого запроса (см. github.com/ mzabriskie / axios # global-axios-defaults)   -  person Ben Hare    schedule 19.06.2016
comment
Разве это не axios.defaults.headers для настройки параметров заголовка REQUEST? Мне нужно получить доступ к ОТВЕТУ. @BenHare   -  person TWONEKSONE    schedule 19.06.2016
comment
Кстати, то, что вы назвали запросом, не является запросом. Это обещание вашего ответа. Ваш запрос был тем, что вы передали методу post () в качестве аргументов.   -  person Daniel    schedule 27.06.2017


Ответы (12)


В случае запросов CORS браузеры по умолчанию могут получить доступ только к следующим заголовкам ответов:

  • Кэш-контроль
  • Content-Language
  • Тип содержимого
  • Истекает
  • Последнее изменение
  • Прагма

Если вы хотите, чтобы ваше клиентское приложение могло иметь доступ к другим заголовкам, вам необходимо установить Access-Control-Expose-Headers на сервере:

Access-Control-Expose-Headers: Access-Token, Uid
person Nick Uraltsev    schedule 20.06.2016
comment
Плохо, что я забыл выставить эти поля. - person TWONEKSONE; 27.06.2016
comment
Если вы используете Rails с Rack-Cors, вам нужно установить expose: ['Access-Token', 'Uid'] в начале координат, например: resource '*', :headers => :any, :methods => [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Access-Token', 'Uid'] - person CWitty; 25.09.2017
comment
Я не понимаю. Если они не отображаются, почему дополнительные заголовки видны в браузере, но не в ответе axios? - person adanilev; 30.11.2018
comment
@adanilev, браузеры позволяют вам видеть их в целях отладки, но не позволяют получить к ним доступ через API по соображениям безопасности. Это предотвращает получение клиентами защищенных учетных данных с серверов, позволяя серверу определять, какой доступ имеет клиент. TL; DR: это сделано специально для безопасности - person erfling; 25.01.2019
comment
У меня есть это в моем файле конфигурации NGINX ... 'Access-Control-Expose-Headers' 'Authorization, X-Suggested-Filename, content-disposition' always; Все еще вижу, что content-type: "application/pdf" действительно нужно вытащить content-disposition - person Old Man Walter; 27.09.2019
comment
В моем серверном приложении grails я установил заголовки expose как cors.expose.headers = ['authorization'], и я также вижу Access-Control-Expose-Headers: Authorization на вкладке моей сети. Но я не могу понять это из ответа Axios. Здесь также в вопросе @TWONEKSONE, вкладка сети уже содержит Access-Control-Expose-Headers: Authorization, но почему он не смог получить доступ к заголовкам? Пожалуйста помоги. - person Prabin Upreti; 25.03.2020
comment
Я решил это, добавив заголовок (Access-Control-Allow-Headers: Authorization, Custom-Header) в серверную часть PHP. - person Bi Wu; 09.07.2020
comment
Спасибо. Работал в Java Spring response.addHeader("Access-Control-Expose-Headers", "Access-Token"); response.addHeader("Access-Token","yourToken");, где ответ - HttpServletResponse - person E Ciotti; 27.11.2020

Это мне очень помогло, спасибо Нику Уральцеву за ваш ответ.

Для тех из вас, кто использует nodejs с cors:

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

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

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

Если вы отправляете ответ в виде res.header('Authorization', `Bearer ${token}`).send();

person cass    schedule 01.07.2018
comment
Для тех, кому интересно, вы также можете передать здесь массив: visibleHeaders: ['Authorization', 'X-Total-Count'] - person Thiago Santana; 26.03.2020

Я столкнулся с той же проблемой. 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;
}

Надеюсь это работает.

person Daniel Azamar    schedule 22.10.2018

Столкнулся с той же проблемой в ядре asp.net Надеюсь, это поможет

public static class CorsConfig
{
    public static void AddCorsConfig(this IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder
                .WithExposedHeaders("X-Pagination")
                );
        });
    }
}
person Chitova263    schedule 16.04.2019
comment
Добро пожаловать в SO! Ваш ответ может быть правильным, но в StackOverflow не рекомендуется публиковать только ответ с кодом. Пожалуйста, объясните, как ваш ответ решает исходный вопрос. прочтите, пожалуйста, о том, как написать лучший ответ - person nircraft; 16.04.2019
comment
Спасибо, помогло;) - person Florian; 15.05.2019

Согласно официальным документам:

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

person Yogesh Bhatt    schedule 09.04.2020

Для SpringBoot2 просто добавьте

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

в код реализации фильтра CORS, чтобы добавить custom-header1 и custom-header2 в белый список и т. д.

person JackTheKnife    schedule 04.05.2020

Есть еще один намек, которого нет в этом разговоре. для asp.net core 3.1 сначала добавьте ключ, который вам нужно поместить в заголовок, примерно так:

Response.Headers.Add("your-key-to-use-it-axios", "your-value");

где вы определяете политику cors (обычно она находится в Startup.cs), вы должны добавить этот ключ в WithExposedHeaders следующим образом.

          services.AddCors(options =>
        {
        options.AddPolicy("CorsPolicy",
            builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowAnyOrigin()
                .WithExposedHeaders("your-key-to-use-it-axios"));
        });
    }

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

          localStorage.setItem("your-key", response.headers["your-key-to-use-it-axios"]);

вы можете после использования его на всей клиентской стороне, получив к нему доступ следующим образом:

const jwt = localStorage.getItem("your-key")
person KBT    schedule 06.01.2021

для помощи django

CORS_EXPOSE_HEADERS = [
        'your header'
    ]
person VladimirDev    schedule 31.03.2020
comment
По крайней мере, для Flask CORS вы также можете передать dict, в котором каждый ключ назван CORS_<property> (в данном случае expose_headers), и передать его с желаемыми значениями в операторе CORS(app, **cors_config). См. Документы здесь - person cpinamtz; 01.04.2021

Пользовательские заголовки HTTP недоступны на стороне клиента из-за ограничений CORS. Вам нужно добавить настройку Access-Control-Expose-Headers на стороне сервера.

Что такое Access-Control-Expose-Headers?
Перейдите на https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Заголовки

По умолчанию доступны только эти заголовки HTTP:

  • Кэш-контроль
  • Content-Language
  • Content-Length
  • Тип содержимого
  • Истекает
  • Последнее изменение
  • Прагма

Для настраиваемых заголовков HTTP вам необходимо настроить Access-Control-Expose-Headers в заголовках ответов.

Если вы используете Django на стороне сервера, вы можете использовать django-cors-headers (https://pypi.org/project/django-cors-headers/) для управления настройками CORS.

Например, с помощью django-cors-headers вы можете добавить список заголовков HTTP, которые должны отображаться в браузере с помощью CORS_ALLOW_HEADERS настройки

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = list(default_headers) + [
    'my-custom-header',
]

person Priyanshu Jain    schedule 09.10.2020

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

Например, чтобы добавить заголовок authorization для YourController методов:

@CrossOrigin(exposedHeaders = "authorization")
@RestController
public class YourController {
    ...
}
person M. Dudek    schedule 20.07.2020

Если вы используете Laravel 8 для внутренней стороны с правильно настроенным CORS, добавьте эту строку в config/cors.php:

'exposed_headers' => ['Authorization'],

person Gevorg Melkumyan    schedule 23.10.2020

[подробности того, что сказал @vladimir]

если вы используете Django
и _1 _ чтобы разрешить / контролировать CORS, вы должны установить следующее в вашем settings.py

CORS_EXPOSE_HEADERS = ['yourCustomHeader']
person Aarif    schedule 21.07.2021