web-dev-qa-db-ja.com

golang Gorilla CORSハンドラーを機能させる

以下のコードで説明されているように、ここではかなり単純なセットアップをしています。しかし、CORSを機能させることはできません。このエラーが発生し続けます:

XMLHttpRequestはロードできません http:// localhost:3000/signup 。プリフライトリクエストへの応答がアクセス制御チェックに合格しません。リクエストされたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' http:// localhost:80 'はアクセスを許可されません。応答のHTTPステータスコードは403です。

私はここで簡単な何かを見逃していると確信しています。

ここに私が持っているコードがあります:

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "myApp/src/controllers"
)

func main() {
    ac := new(controllers.AccountController)

    router := mux.NewRouter()
    router.HandleFunc("/signup", ac.SignUp).Methods("POST")
    router.HandleFunc("/signin", ac.SignIn).Methods("POST")

    log.Fatal(http.ListenAndServe(":3000", handlers.CORS()(router)))
}
21
Moon

Markusが提案したリンクと、CORSプリフライトリクエストをトリガーするものについてお読みください。

プリフライトリクエスト:JSONなどのコンテンツタイプ、またはプリフライトリクエストをトリガーするその他のカスタムヘッダーを使用できますが、サーバーでは使用できません取り扱います。フロントエンドでever-common AJAXを使用している場合は、これを追加してください: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requested- With

Gorillaのhandlers.CORS()は、適切なデフォルトを設定してCORSの基本を動作させます。ただし、より機能的な方法で制御を行うことができます(おそらくそうすべきです)。

以下にいくつかのスターターコードを示します。

// Where Origin_ALLOWED is like `scheme://dns[:port]`, or `*` (insecure)
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
originsOk := handlers.AllowedOrigins([]string{os.Getenv("Origin_ALLOWED")})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

// start server listen
// with error handling
log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT"), handlers.CORS(originsOk, headersOk, methodsOk)(router)))
35
jeremiah.trein

CORSOptionオブジェクトを作成する必要があります。たとえば、Originを許可するには、次のコードを使用します。

corsObj:=handlers.AllowedOrigins([]string{"*"})

次に、このオブジェクトをhandle.CORS関数に渡します。

log.Fatal(http.ListenAndServe(":3000", handlers.CORS(corsObj)(router)))

テストするには、CURLを使用できます。

curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose http://127.0.0.1:3000

動作すると、これらのヘッダーが表示されます:

> Accept: */*
> Origin: http://example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With

最終コードはこちら: https://play.golang.org/p/AOrlJsWhvf

詳細:

16

詳細については、こちらをご覧ください。 「リクエストされたリソースに「Access-Control-Allow-Origin」ヘッダーがありません」 この問題について。

次のハンドラーも試してください: Go Cors Handler これで問題を解決できます。私はこれがずっときれいで問題を解決しやすいと思います。

package main

import (
    "log"
    "net/http"
    "github.com/rs/cors"
    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "myApp/src/controllers"
)

func main() {
    ac := new(controllers.AccountController)

    router := mux.NewRouter()
    router.HandleFunc("/signup", ac.SignUp).Methods("POST")
    router.HandleFunc("/signin", ac.SignIn).Methods("POST")

    c := cors.New(cors.Options{
    AllowedOrigins: []string{"http://localhost:8000"},
    AllowCredentials: true,
    })

    handler := c.Handler(router)

    log.Fatal(http.ListenAndServe(":3000", handler )
}
14
user5906464
package main

import (
    "log"
    "net/http"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "myApp/src/controllers"
       "github.com/rs/cors"
)

func main() {

     ac := new(controllers.AccountController)

    router := mux.NewRouter()
    router.HandleFunc("/signup", ac.SignUp).Methods("POST")
    router.HandleFunc("/signin", ac.SignIn).Methods("POST")
//cors optionsGoes Below
corsOpts := cors.New(cors.Options{
    AllowedOrigins: []string{"http://localhost:8100"}, //you service is available and allowed for this base url 
    AllowedMethods: []string{
        http.MethodGet,//http methods for your app
        http.MethodPost,
        http.MethodPut,
        http.MethodPatch,
        http.MethodDelete,
        http.MethodOptions,
        http.MethodHead,
    },

    AllowedHeaders: []string{
        "*",//or you can your header key values which you are using in your application

    },
})

    http.ListenAndServe(":3000", corsOpts.Handler(router))
}
1
muthukumar