Vue + Golang:CORS 策略已阻止从源访问 [Apiurl] 处的 XMLHttpRequest:不允许请求 header 字段授权

Vue + Golang : Access to XMLHttpRequest at [Apiurl] from origin has been blocked by CORS policy: Request header field authorization is not allowed

我是 Vuejs 和 golang 的初学者。 我在从 vue axios 调用 api 时尝试通过 header 发送授权令牌时出现以下错误。

CORS 策略已阻止从源 'http://localhost:5500' 访问 'http://localhost:5000/greet/hello' 处的 XMLHttpRequest:预检响应中的 Access-Control-Allow-Headers 不允许请求 header 字段授权。

[实际上我在另一个项目中出错了。但为了理解解决方案,我在简单的以下项目中实现了这一点。所以任何人都可以在他们的最后测试代码并提供解决方案]

App.go

package main

import (
    "fmt"

    "github.com/gin-contrib/cors"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.Use(cors.Default())
    router.Use(Authenticate())

    v1 := router.Group("/greet")
    {
        v1.POST("/hello", handleFunc)
    }
    router.Run(":5000")
}

func handleFunc(c *gin.Context) {
    var student struct {
        Name string `json:"name"`
    }

    if c.BindJSON(&student) != nil {
        c.JSON(400, gin.H{"message": "Provide required details."})
        c.Abort()
        return
    }

    message := fmt.Sprintf("%s%s", "Good Morning ", student.Name)

    c.JSON(200, gin.H{"message": message})
}

func Authenticate() gin.HandlerFunc {

    return func(c *gin.Context) {

        requiredToken := c.Request.Header["Authorization"]

        if len(requiredToken) == 0 {
            c.JSON(400, gin.H{"message": "No token found"})
            c.Abort()
            return
        }

        fmt.Println(requiredToken)

        c.Next()
    }
}

index.html

<html>
    <head>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.js"></script>
    </head>
    <body>
        <div id="app" class="container m-5">
            <p>{{name}}</p>
            <input type="text" class="form-control col-3" placeholder="Enter Name" v-model="name"/><br>
            <button @click="onButtonClick" class="btn btn-info">CALL API</button>
        </div>
        <script src="index.js"></script>
    </body>
</html>

index.js

var app = new Vue({
  el: '#app',
  data: {
    name: ""
  },
  methods: {
    onButtonClick() {
      axios
        .post("http://localhost:5000/greet/hello",
          {
            Name: this.name
          },
          {
            headers: {
              Authorization: "HEY"
            }
          })
        .then((response) => {
          if (response.status == 200) {
            alert(response.data.message);
          }
        })
        .catch((error) => {
          console.log(error);
          alert(error.response.data.message);
        });
    },
  }
})

基本上在发送授权 header 时不允许 Allowed-Origin: * 所以你必须指定允许的域,你可以通过更改 CORS 中间件而不是使用默认 router.Use(cors.Default())

你可以使用这样的东西

router.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"http://localhost:5500"},
    AllowMethods:     []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
    AllowHeaders:     []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
    ExposeHeaders:    []string{"Content-Length"},
    AllowCredentials: true,
    MaxAge: 12 * time.Hour,
}))

您还可以使用 AllowOriginFunc cors.Config 属性 作为动态逻辑(如果您想支持多个域)。

注意 AllowOrigin 属性 如何包含您的 vue 项目的域。显然,您可以允许更多 header,但此处列出的是您之前使用默认配置允许的