首页 > 解决方案 > 如何在 Go 中启用 CORS

问题描述

我是 golang 中这个 CORS 的新手。我使用这个包“github.com/rs/cors”。我用示例代码对其进行了测试:

package main

import (
    "log"
    "net/http"

    "github.com/julienschmidt/httprouter"
    "github.com/rs/cors"
)

func Hello(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte("{\"hello\": \"world\"}"))
}

func main() {
    router := httprouter.New()
    router.GET("/", Hello)

    _cors := cors.Options{
        AllowedMethods: []string{"POST", "OPTIONS"},
        AllowedOrigins: []string{"http://localhost:8080"},
    }
    handler := cors.New(_cors).Handler(router)

    http.ListenAndServe(":8282", handler)
}

当我从浏览器点击时,它正常响应,没有任何问题。当我从 Go 中制造的客户端中击中时,同样的事情发生了。我想念什么?

编辑:我希望这个 CORS 将过滤来自不同来源/服务器的请求。当我只将允许的方法设置为 POST 和 OPTIONS 时,我从浏览器和 Go 中制作的客户端使用 GET 时,由于不允许 GET,它是否应该返回错误?,如何使用这个包?

标签: gocors

解决方案


CORS 是一种防止在浏览器中运行的脚本(即 Javascript)来自不同来源(服务器)调用特定服务器的机制。这个特定的服务器需要小心任何脚本攻击自己,因为可能会应用一些恶意的东西或任何授权策略。这个特定的服务器可以在其 API 中创建一个中间件来检查预检请求,这是一个使用 OPTIONS 方法的 CORS 请求,它带有一些特定的标头。

预检请求是 CORS 模型的一个组件,其中这是应用于浏览器的 CORS 机制标准化的一部分。因此,如果有任何脚本通过浏览器执行,则发送此预检请求的人是浏览器(不要误认为是从浏览器地址栏点击)。此预检请求应用于通常执行请求的 API,例如在 Javascript 中您有 XMLHttpRequest 或 Fetch API。通过这些 API 发送的具有任何方法的任何类型的请求都将在称为“预检”请求的单独请求之前使用 OPTIONS 方法带来额外的标头,详细说明调用者的信息。此预检请求将由目标服务器通过检查其请求标头并与其应用的 CORS 规则进行比较来处理。此选项将返回什么方法的信息,来源(允许的来源),或根据其规则允许的任何标头。一旦此预检请求完成并获得包含目标服务器 cors 策略信息的详细标头的响应。如果调用者没有违反基于该服务器 cors 策略的任何内容,则 API/浏览器将在作为实际请求的预检请求之后发出下一个请求。否则将作为 cors 错误返回,并且永远不会发出实际请求。

从浏览器地址栏调用不会有任何效果,因为您没有执行任何脚本(从浏览器),并且浏览器地址栏通常是 GET 方法,而不是 OPTIONS 方法,因此不会被视为预检请求。如果您从用其他编程语言(例如 Go)制作的客户端调用它,那么这里不应用 CORS 机制,因为就像其他所说的 cors 应用于从浏览器中的脚本调用一样。如果您想过滤来自不同服务器的浏览器(例如 Go)以外的客户端的请求,那么您需要的是 OAUTH 机制或 ACL(访问控制列表),它们是不同的,与这些 CORS 的东西无关。

关于您提到的包,该包是为了简化您的工作,因此您不必自己处理额外的标头和预检请求,而是可以将处理程序包装在包中。

更多关于 CORS的信息在这里


推荐阅读