2017-08-30 1 views
0

私はAPIを持っていますが、現在はそのエンドポイントの1つを消費しようとしています。エンドポイントはPOST要求用で、エンドポイントは期待どおりに動作しています。 APIはクラウドで実行されており、curlでテストしたところ完璧だったので、私の反応アプリから消費しようとしていましたが、私は403 status codeを取得します。Gorilla MuxのCORSの設定:POST要求時の403エラー

ブラウザのコンソールで眺め私はOPTIONSリクエストでそのエラーが発生し、POSTが完了しないことがわかります。ここでは、コンソールに表示された結果のスクリーンショットは、次のとおりです。

enter image description here

その後、私はフォームを持つ単純なHTMLファイルを作った、そこに私は、必要な入力を置き、そしてアクションは、このエンドポイントを指して、それが働きましたかなりよく。そして、私はどこにエラーがあるのか​​分からないのですか?私はゴリラ/マルチプレクサを使用していAPIではAPI

でCORSを有効にしていると私はこのようなものがあります:使用

// Set up a router and some routes 
    r := mux.NewRouter() 
    r.HandleFunc("/", handleHome) 
    //some other routes 

    headersOk := handlers.AllowedHeaders([]string{"*"}) 
    originsOk := handlers.AllowedOrigins([]string{"*"}) 
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) 

    // Start http server 
    port := fmt.Sprintf(":%d", SomePort) 
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r)) 

を:

"github.com/gorilla/mux" 
"github.com/gorilla/handlers" 

私は取得していますメッセージをブラウザは、(スペイン語)である:

Solicitud desde otro原産地bloqueada:ラpolíticaデMISMO原産地 IMP (ACCESS CONTROLLER-ACCY-ORIGINAL)」を参照してください。

英語:CORSヘッダーが存在しないため、基本的にサーバーは要求を拒否しています。

ルータの設定で何が間違っていますか?

+2

を受け入れるしたいとしましょうとあなたのapi一般的に。どのリクエストヘッダーを送信していますか? https://fetch.spec.whatwg.org/#cors-safelisted-request-headerにリストされているヘッダー以外のヘッダーを送信している場合は、そのヘッダーに要求が先行していて、APIはOPTIONS要求で403を送信しています。 APIをチェックしてください。 – cowbert

+0

@cowbertが正しい!それは送信されている唯一のヘッダーです –

+0

https://stackoverflow.com/questions/45967591/config-cors-in-gorilla-muxのコメントに記載されているように、あなたのリクエストは「 'osn'」リクエストヘッダーを追加しているようですAccess Control-Allow-Originを追加するだけで、追加する必要は全くありません。そのため、ブラウザがプリフライトオプションを実行するようになります。また、他の質問のコメントでも言及されているように、問題は、リクエストを送信している任意のURLにOPTIONS要求のための403でサーバーが応答していることです。したがって、そのルートへのOPTIONSリクエストの認証を要求しないようにバックエンドを設定する必要があります – sideshowbarker

答えて

2

rs/corsでは、CORSの問題をかなり簡単に解決する必要があります。あなたのserver.go

package main 

import (
    . . .  
    "fmt" 
    "log" 
    "net/http" 
    "github.com/gorilla/mux" 
    "github.com/rs/cors" 
    "../myhandler" 
) 

func main() { 

fmt.Println("Settin up server, enabling CORS . . .") 

    c := cors.New(cors.Options{ 
     AllowedOrigins: []string{"*"}, // All origins 
     AllowedMethods: []string{"GET"}, // Allowing only get, just an example 
    }) 

    router := mux.NewRouter() 
    // Example handler 
    router.HandleFunc("/test", myhandler.TestHandler()) 
    http.Handle("/", router) 

    // Bind to port 8000 and pass our router in and pass the cors Handler 
    log.Fatal(http.ListenAndServe(":8000"), c.Handler(router))) 

    fmt.Println("Server is ready and is listening at port :8000 . . .") 

} 

そして、あなたのtesthandler.go上で

、あなたはこれがreactjsとは何の関係もなく、AJAXを持っていないContent-Type: application/json

. . . 

func TestHandler func(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(http.StatusOK) 
    return 
} 
関連する問題