28

我已通读RFC 2617,但如果支持多个方案,则无法在此处或其他任何地方找到分隔符。例如,假设同时支持 Basic 和 Digest。我知道它可能会这样出现:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic
WWW-Authenticate: Digest

但我也读到两者都可以列为一行,但没有人展示示例或描述要使用的分隔符。我已经看到可以单个方案中使用逗号的警告:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest param1="foo", param2="bar"

我还读到如果在一个方案中使用逗号,其他方案必须放在单独的行上。所以我想在上述情况下,如果我们添加 Basic,它会如下所示:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest param1="foo", param2="bar"
WWW-Authenticate: Basic

这很简单。但现在假设你只有一条线

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Scheme stuff, morestuff, more stuff

那是哪个?那是逗号分隔的方案列表,还是只有几个参数的方案?

4

1 回答 1

30

据我所知,该规范对这个问题进行了抨击。第 1.2 节规定:

注意:用户代理在解析 WWW -Authenticate 或 Proxy-Authenticate 标头字段值时需要特别小心,如果它包含 多个挑战

,或者如果提供了多个 WWW-Authenticate 标头
字段,因为挑战的内容它本身可能
包含一个以逗号分隔的身份验证参数列表。

我想我们可以把特别关心翻译成祝你好运

实用主义
作为一个实际问题,我怀疑多个方案意味着一个应该使用多个wwww-authenticate标题。方案是可扩展的;例如,如果我想变得险恶,我可以想出一个名为“草莓”或“不透明”的方案。鉴于此,如果没有某种“方案终止”定界符,就没有真正的好方法来解析单行。

W3C 讨论
你不是第一个提出这个问题的人。W3C 邮件列表上有一个讨论。海报说:

我并没有质疑在单一响应中提供多个挑战的必要性。考虑到它创建的分隔符的奇怪组合,我只是质疑在单个标题字段中允许多个挑战是否明智。

其他一些讨论当前问题和可能感兴趣的未来行动的线程:

如果只是......
不是我有胃口,但可以挖掘 chromimum、firefox 和 webkit 代码,看看这些社区是如何处理这个问题的。

于 2012-06-28T22:02:22.673 回答