首页 > 其他分享 >后端服务CORS预检请求验证问题探究

后端服务CORS预检请求验证问题探究

时间:2022-10-23 17:23:09浏览次数:69  
标签:Control siyuan 预检 Access 探究 API https CORS

问题探索

问题引入

目前在 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

标签:Control,siyuan,预检,Access,探究,API,https,CORS
From: https://www.cnblogs.com/tangyouwei/p/back-end-service-coros-pre-inspection-request-verific

相关文章

  • Django 跨域CORS
    解决后端对跨域访问的支持。安装pipinstalldjango-cors-headers注册应用INSTALLED_APPS=[...,corsheaders,...]中间件设置MIDDLEWARE=[......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        作为新课程下高中数学核心素养培养的重要目标值,建模能力是学生数学解题能力发展中不可或缺的一种关键能力,也是学生逻辑思维及思维模式有效运用的具体表现。加强......
  • 一起来探究@Schedule定时任务在分布式产生的问题
    一、搭建基本环境基本依赖<parent><artifactId>spring-boot-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.7.2</version><......
  • 配置Tomcat 8 访问静态资源,并解决Tomcat8 CORS跨域问题
    解决Tomcat8CORS跨域问题由于我们的应用程序在访问上述静态资源的时候会涉及跨域的问题,如何解决CORSonTomcat的问题,需要进行<filter>的配置。打开apache-tomcat-8.5.......
  • 探究 | Elasticsearch集群规模和容量规划的底层逻辑
    Elasticsearch最少必要知识实战教程直播回放0、引言实战中经常遇到的问题:问题1:请问下大家是如何评估集群的规模?比如数据量达到百万,千万,亿万,分别需要什么级别的集群,这要......
  • 关于同步方法里面调用异步方法的探究
    前言我在写代码的时候(.netcore)有时候会碰到void方法里,调用async方法并且Wait,而且我还看到别人这么写了。而且我这么写的时候,编译器没有提示任何警告。但是看了dudu的文章:......
  • 搜索中常见数据结构与算法探究(二)
    本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫;读者可以通过比较几种算法的差异,进一步了解匹配算法演进......
  • 搜索中常见数据结构与算法探究(二)
    本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫;读者可以通过比较几种算法的差异,进一步了解匹配算法演......
  • 搜索中常见数据结构与算法探究(一)
    1前言ES现在已经被广泛的使用在日常的搜索中,Lucene作为它的内核值得我们深入研究,比如FST,下面就用两篇分享来介绍一些本文的主题:第一篇主要介绍数据结构和算法基础和分析方......
  • 搜索中常见数据结构与算法探究(一)
    1前言ES现在已经被广泛的使用在日常的搜索中,Lucene作为它的内核值得我们深入研究,比如FST,下面就用两篇分享来介绍一些本文的主题:第一篇主要介绍数据结构和算法基础和分......