Проблема с заголовками CORS для сервера на Go - PullRequest
1 голос
/ 11 июня 2019

Сейчас я пишу простой сервер на Go, используя стандартную библиотеку net / http. Сервер помещается в докер-контейнер и размещается в облачной форме Google. Но когда я хочу получить доступ к серверу из стороннего приложения React (расположенного на другом сервере), я всегда получаю сообщение об ошибке CORS.

Ища решения онлайн, я добавил библиотеку в свой код, которая предназначена для решения проблемы СORS. Но добавление библиотеки не помогло. Даже после его применения сервер не отправляет мне заголовки СORS. Какой код у меня сейчас?

package main

import (
    controller "./controllers"
    "./util"
    "github.com/gorilla/mux"
    "github.com/rs/cors"
    "log"
    "net/http"
    //"os"
)

// Entry point
func main() {
    c := cors.New(cors.Options{
        AllowedOrigins: []string{"*"}, // All origins
        AllowedMethods: []string{"GET"}, // Allowing only get, just an example
        AllowedHeaders: []string{"Authorization", "Content-Type"},
        AllowCredentials: true,
        Debug: true,
    })

    r := mux.NewRouter()
    // Router
    // Live check
    r.HandleFunc("/live", controller.LiveCheck)
    apiRouter := r.PathPrefix("/api").Subrouter()
    // Medication data
    medicationRouter := apiRouter.PathPrefix("/medication").Subrouter()
    medicationRouter.HandleFunc("", controller.MedicationHeadersList).Methods("GET")
    medicationRouter.HandleFunc("/{id}", controller.MedicationChildrenList).Methods("GET")
    medicationRouter.HandleFunc("/{id}/leafs", controller.MedicationLeafsList).Methods("GET")
    medicationRouter.HandleFunc("/search/", controller.SearchMedicationList).Methods("GET")
    medicationRouter.HandleFunc("/result/{id}", controller.MedicationSearchResult).Methods("GET")

    //r.Use(util.CORS)
    apiRouter.Use(util.VerifyToken)

    log.Println(http.ListenAndServe(":8080", c.Handler(r)))
}

Вот ответ, который я получаю из верхней части консоли браузера:

Request Method: OPTIONS
Status Code: 200 OK
Remote Address: 35.190.37.37:80
Referrer Policy: no-referrer-when-downgrade
Content-Length: 0
Date: Mon, 10 Jun 2019 22:37:36 GMT
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
Via: 1.1 google

Я также попытался вручную установить заголовки CORS, создав промежуточное программное обеспечение, но это также не помогло. Заранее спасибо за помощь!

UPD Спасибо всем за ответы и помощь. Все оказалось намного проще. Google не обновил мой докер-контейнер, поэтому все мои изменения в коде не дали желаемого эффекта. Мой код, который я дал в описании вопроса, отлично решает проблему CORS. Вопрос можно считать закрытым.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

У меня тоже была эта проблема. Вы можете использовать этот код в среде разработки.

    c := cors.New(cors.Options{
        AllowedOrigins:   []string{"*"},
        AllowCredentials: true,

        AllowedHeaders: []string{"Authorization", "Content-Type", "Access-Control-Allow-Origin"},
        // Enable Debugging for testing, consider disabling in production
        AllowedMethods: []string{"GET", "UPDATE", "PUT", "POST", "DELETE"},
        Debug:          true,
    })
0 голосов
/ 11 июня 2019

Как вы это тестируете? Когда браузер должен сделать запрос на отправку из разных источников, который не соответствует условиям перед полетом, отправляется запрос OPTIONS. Этот запрос OPTIONS содержит заголовок, значение которого является методом HTTP, используемым в запросе перекрестного источника.

Я поднял вашу упрощенную версию вашего сервера, и вот несколько примеров команд и результатов curl.

Следующий запрос работает нормально, я установил Access-Control-Request-Method на GET

curl -I -X OPTIONS -H "Origin: test.com" -H "Access-Control-Request-Method: GET" http://localhost:8080/
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Date: Tue, 11 Jun 2019 02:20:35 GMT
Content-Length: 0

Приведенный ниже запрос не работает без заголовка Access-Control-Request-Method. Наш сервер может иметь различные настройки CORS для GET и POST (и т. Д.), И наш сервер не может сообщить об этом клиенту. Клиент должен установить заголовок Access-Control-Request-Method, чтобы сервер знал, как правильно ответить.

curl -I -X OPTIONS -H "Origin: test.com" http://localhost:8080/
HTTP/1.1 200 OK
Date: Tue, 11 Jun 2019 02:31:12 GMT
Content-Length: 436
Content-Type: text/html; charset=utf-8
...