服务器如何知道使用凭据发送的请求?

Posted

技术标签:

【中文标题】服务器如何知道使用凭据发送的请求?【英文标题】:How does a server know a request is sent with credentials? 【发布时间】:2019-04-14 07:18:51 【问题描述】:

当我通过我的网站从另一台服务器请求资源时,我遇到了一个问题。

我请求资源(通过 Range Requests 请求的 PDF 文件)。 浏览器(本例中为 Chrome)向服务器发送一个 OPTIONS 请求。 服务器从 OPTIONS 返回 200,但其中一个标头是 - Access-Control-Allow-Credentials: true 由于服务器为Access-Control-Allow-Origin 响应标头公开了通配符*,因此(我认为)Chrome 会从服务器抛出以下响应并给我一个错误,指出如果请求是服务器无法公开通配符发withCredentials = 'include'

现在,我没有在我可以看到的代码中的任何地方设置withCredentials 标志,并且我似乎无法找出服务器如何知道是否使用凭据发送请求。我的 cookie 不会随 OPTIONS 或 GET/PARTIAL CONTENT 请求一起发送。我可以看到请求中没有其他特殊标头。

所以,

    服务器如何知道以及我如何知道客户端的 wither 凭据是否设置为包含?

    如果我没有设置凭据,是什么导致 Chrome 认为我正在使用的模式是 withCredentials = 'include'

    服务器是否应该在 OPTIONS 之后的所有请求中发回 Access-Control-Allow-Credentials: true 标头?

【问题讨论】:

@sideshowbarker 在回答你的最后一点时,我都不能,也没关系。我将 withCredentials 明确设置为 false,但请求在实际发送之前确实通过了一些供应商代码。该代码是缩小的 JS 和/或 WASM C 代码。我会接受 cmets 作为有效答案,因为它强化了我期望听到的内容。我的猜测是供应商代码以某种方式设置它,我只是找不到它并将与他们联系。如果我不能以编程方式检查“withCredentials”,那么我不确定我还能做什么。 【参考方案1】:
    服务器如何知道以及我如何知道客户端的 wither 凭据是否设置为包含?

接收服务器对客户端withCredentials 设置一无所知。服务器只是在请求中接收某种形式的凭据,或者不接收。就 CORS 协议而言,接收服务器不会根据请求是否包含凭据而改变其行为。接收服务器要么只发回 Access-Control-Allow-Credentials: true 响应头,要么不发回。

    如果我没有设置凭据,是什么导致 Chrome 认为我正在使用的模式是 withCredentials = 'include'

答案是,它是主观的——这取决于服务器管理员打算将响应发给谁。但最佳实践是,您可能只想将Access-Control-Allow-Credentials: true 发送回您知道并明确允许的特定来源。这就是为什么 CORS 协议有这样的限制:如果请求具有凭据并且响应具有 Access-Control-Allow-Origin: *(通配符)标头值,它将不允许您的前端代码访问响应。

    服务器是否应该在 OPTIONS 之后的所有请求中发回 Access-Control-Allow-Credentials: true 标头?

Chrome 只会认为该模式实际上是 withCredentials = 'include'。因此,要么您的客户端代码的某些部分 实际上设置了 withCredentials = 'include' — 否则,withCredentials = 'include' 没有 实际上全部设置,但您出于某种原因只是认为它是。

【讨论】:

以上是关于服务器如何知道使用凭据发送的请求?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 用户身份验证和授权

如何在 Java 中发送带有 XML 数据的 HTTPS POST 请求

授权请求标头与凭据的 POST 请求正文

如何将用户凭据传递给 Web 服务?

有没有办法在请求正文中为 Next-Auth 中的令牌调用发送客户端凭据?

无法将带有凭据的 http 帖子发送到 iis 节点服务器