CORS - 服务器如何知道是否使用了Jquery ajax的"withCredentials:true"选项?

5

我正在一个框架中实现CORS(跨域资源共享)。

我知道当使用Jquery的ajax(...)并且withCredentials属性为true时,如果服务器必须响应这两个内容:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin:[THE_DOMAIN]

服务器不能用通配符响应:Access-Control-Allow-Origin:*:那样是无法工作的

我的问题:在服务器上如何知道已经使用了withCredentials: true,从而不使用通配符呢?

我比较了使用withCredentials: false和使用withCredentials: true时发送的头,它们是相同的!

所以,如果我确实希望允许客户端请求凭据,这是否意味着我不能使用Access-Control-Allow-Origin:*


1
如果将withCredentials设置为true,则还应接收在源域上设置的任何cookie,我不确定这是否适用于初始请求还是仅在服务器响应Access-Control-Allow-Credentials: true后(我可以想象两种情况都是正确的,尽管我认为后者最有可能)。至于通配符,我倾向于始终指定允许的域(从原始标头)。此答案可能有所帮助 - Rogier Spieker
@RogierSpieker 当使用 withCredentials: true 进行查询但没有任何 cookie 时,通配符也会失败。我认为强制客户端在使用 withCredentials: true 时发送 cookie 是不可取的...你不知道他代码的逻辑。所以我认为你不能真正依赖于 cookie 的存在。感谢您的帮助! - electrotype
我并不是在暗示应该强制设置一个Cookie,只是当设置了withCredentials:true时,Cookie会被设置。这种情况下,有一个Cookie的存在将表明withCredentialstrue - Rogier Spieker
1个回答

2
所以,如果客户端请求允许凭证,那么这是否意味着我永远不能使用Access-Control-Allow-Origin:*?
是的。
Access-Control-Allow-Origin:* 的目的是让你只需很少的努力就能授予每个网站访问权限。它允许你说“这些数据是公开的,任何人都可以访问”。
如果您需要凭证才能访问资源,则说“这些数据是公开的,任何人都可以访问”是没有意义的。
如果您授予每个网站访问权限,则每个登录到您的网站的人访问的每个网站都可以从中读取数据(实际上使其公开)。
所以,您需要有一个受信任的站点白名单,允许它们访问数据,并在明确授予它们访问权限之前检查 Origin 头。

我想你是对的!但我仍然不确定为什么有人会想要使用通配符版本!我的意思是,你只需要将请求的“Origin”头复制到响应的“Access-Control-Allow-Origin”头中,这也会“授予每个网站”,并且你也可以允许凭据... 除了使用“头部复制”技巧时可能会丢失的东西外,通配符版本还有其他功能吗? - electrotype
1
您可以在服务器配置中使用一行代码添加一个具有静态值的标头。动态回显Origin标头需要更多的工作。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接