问题探索

问题引入

目前在 Vite+Vue3 的项目中使用 fetch API 调用 siyuan 的 API 时候,如果加上 API 鉴权,就会返回 CORS 错误,如下:

根据 https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request 这篇文章的理解

在检测到 CORS 跨域复杂请求(例如 POST 等)时候,会发送一个 OPTIONS 的预检请求,请求会返回下一个请求允许的 header 和 method

检测请求可以看到

可以看到思源服务端返回的 Access-Control-Request-Headers 并没有 Authorization 字段。这就是导致最终 CORS 失败的根本原因。

最优解决方案

查看 https://github.com/siyuan-note/siyuan/blob/master/kernel/server/serve.go) 代码可以看到,服务端是支持 CORS 的,代码如下

ginServer.Use(cors.Default())

这里实用的默认策略。我们看看详细的默认策略

可以看到并没有包含 Authorization 字段。

而 siyuan 的 API 文档鉴权部分明确表示需要在 header 传递该字段

https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md#鉴权

解决方案:
参考了
https://stackoverflow.com/questions/29418478/go-gin-framework-cors

代码修改如下

func CORSMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {

		c.Header("Access-Control-Allow-Origin", "*")
		c.Header("Access-Control-Allow-Credentials", "true")
		c.Header("Access-Control-Allow-Headers", "origin, Content-Length, Content-Type, Authorization")
		c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS")

		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}

		c.Next()
	}
}

然后原来的

ginServer.Use(cors.Default())

调整为

ginServer.Use(CORSMiddleware())

问题解决。

候选的解决方案

如果修改内核影响太大或者看看能不能把跨域策略提供配置可选。

参考

https://blog.csdn.net/root_miss/article/details/82740399

https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request

https://stackoverflow.com/questions/29418478/go-gin-framework-cors

原文地址:http://www.cnblogs.com/tangyouwei/p/back-end-service-coros-pre-inspection-request-verification-question-exploration-zvlefe.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性