不使用 HTTP 基本身份验证时 HTTP 401 未经授权?

Posted

技术标签:

【中文标题】不使用 HTTP 基本身份验证时 HTTP 401 未经授权?【英文标题】:HTTP 401 Unauthorized when not using HTTP basic auth? 【发布时间】:2014-08-24 13:45:26 【问题描述】:

在构建不使用HTTP basic authentication(但其他类似 api-key)的 REST API 并且客户端提供无效凭据时,您应该返回什么 HTTP 状态代码? 401 Unauthorized 还是 403 Forbidden?

IANA HTTP Status Code Registry 列出 RFC7235, Section 3.1 负责“401 Unauthorized”,其中指出:

生成 401 响应的服务器必须发送 WWW-Authenticate 头字段

这是否意味着 REST API 应该只在使用 HTTP 基本身份验证时返回 401,而不是在例如通过 api-key 使用身份验证时?

Django seems 同意:

HTTP 401 响应必须始终包含 WWW-Authenticate 标头,该标头指示客户端如何进行身份验证。 HTTP 403 响应不包含 WWW-Authenticate 标头。

将使用的响应类型取决于身份验证方案。

而 Richardson seems 不同意:

401(“未经授权”) 重要性:高。 客户端尝试在未提供正确身份验证凭据的情况下对受保护资源进行操作。它可能提供了错误的凭据,或者根本没有提供。 凭证可以是用户名和密码、API 密钥或身份验证 令牌——无论有问题的服务期望什么。客户制作是很常见的 请求 URI 并接受 401,这样它就知道要发送什么样的凭据 以及采用什么格式。 [...]

【问题讨论】:

出于各种原因,您应该避免在标头中使用 API 密钥。在这里查看我的讨论:soabits.blogspot.dk/2014/02/… 和 Eran Hammers 的讨论:hueniverse.com/2010/09/29/… 刚刚发现什么基本相同的问题。它没有出现在我之前的搜索中:***.com/questions/17687876/… 【参考方案1】:

您假设 www-authenticate 值需要是基本的。您可以返回不同的值,如“API-key”作为需要发生的身份验证类型。因此,请随时返回 401 和带有其他值的 www-authenticate 标头。您甚至可以返回多个具有不同值的标头,指示您的应用支持的不同类型的身份验证。

【讨论】:

什么规范描述了www-authenticate 的有效值?是否有一个列表或一些事实上的标准化值? 这里有一个(非常新的)列表:iana.org/assignments/http-authschemes/http-authschemes.xhtml

以上是关于不使用 HTTP 基本身份验证时 HTTP 401 未经授权?的主要内容,如果未能解决你的问题,请参考以下文章

android - EWS 2010 中的基本身份验证错误“HTTP/1.1 401 Unauthorized”

使用基于表单的身份验证时,http 服务器应在 401 响应中返回啥 WWW-Authenticate 标头?

通过基本身份验证访问 REST 的 Angular2 抛出“预检响应具有无效的 HTTP 状态代码 401”

HTTP 状态 401 - 身份验证失败:解码传入 SAML 消息时出错

JWT 身份验证始终返回 401 HTTP 错误 asp.net core

HTTP 错误 401.2 - 未经授权 由于身份验证标头无效,您无权查看此页面