Невозможно получить доступ к пользовательскому заголовку ответа в веб-приложении - PullRequest
0 голосов
/ 07 октября 2019

У меня проблемы с получением доступа к пользовательскому заголовку respoone, предоставляемому нашим внутренним сервером. Сервер написан на Go. Я пытаюсь получить к нему доступ, используя axios в качестве моего HTTP-клиента. Я вижу заголовок в консоли chrome dev-tools, но не могу получить доступ к заголовку через axios.

chrome dev tools заголовки ответа. Я ищу, чтобы получить токен x - *** - внизу chrome dev tools . response headers

заголовков, к которым у меня есть доступ через сквозные оси (cors включен) headers I have access to through axios

Однако я могу получить доступ к заголовку через axios, когда я запускаю chrome с отключенными cors:

open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security

заголовки, к которым у меня есть доступ через axios (cors отключены) enter image description here

Это говорит мне, что проблема не в axios, а в конфигурации заголовка, которая у меня есть.

Ниже описано, как мы настроили наши заголовки,Я пытаюсь получить доступ к заголовку x-custom-token :

func allowCORS(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if origin := r.Header.Get("Origin"); origin != "" && contains(cors, origin) {
        w.Header().Set("Access-Control-Allow-Origin", origin)
    }
    if contains(cors, "*") {
        w.Header().Set("Access-Control-Allow-Origin", "*")
    }

    if r.Method == "OPTIONS" || r.Method == "GET" && r.Header.Get("Access-Control-Request-Method") != "" &&
        w.Header().Get("Access-Control-Allow-Origin") != "" {
        headers := []string{"Content-Type", "Accept-Encoding", "X-CSRF-Token", "Authorization", "accept", "origin", "Cache-Control", "X-Requested-With", "x-custom-token"}
        w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ","))
        methods := []string{"GET", "HEAD", "POST", "PUT", "DELETE"}
        w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ","))
        expose := []string{"x-custom-token"}
        w.Header().Set("Access-Control-Expose-Headers", strings.Join(expose, ","))
        return
    }
    h.ServeHTTP(w, r)
})}

Может кто-нибудь сказать мне, какой заголовок я установил неправильно?

1 Ответ

1 голос
/ 08 октября 2019

Ваша проблема в том, что вы выставляете себя только для запросов OPTIONS.

В вашем утверждении if один из ваших критериев: r.Header.Get("Access-Control-Request-Method") != "".

Этот заголовок обычно используется только в пре-flight запросы, и поэтому ваши заголовки expose не записываются в GET или других методах.

Кроме того, ваш оператор возвращается после записи заголовков. Это верно для предполетного полета, но не приведет к отправке контента для других методов.

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

...