当前位置: 首页 > 知识库问答 >
问题:

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

周辰沛
2023-03-14

我有一个web应用程序,其中Javascript部分在浏览器上运行。该前端使用多个HTTPendpoint(或多或少是REST)。前端必须能够区分401和403响应,并且不得接收通常用于人类用户的3xx重定向。

授权通过普通表单登录完成(不涉及Javascript),然后使用会话cookie(用于“REST”和普通请求)。

WWW-Authenticate标头值的正确值是什么?

>

超文本传输协议(HTTP)身份验证方案注册表没有列出任何基于表单的身份验证方案。

另见:

  • 不使用HTTP basic auth时HTTP 401未经授权

共有3个答案

杜烨伟
2023-03-14

理论上你应该回应

HTTP/1.x 401 Unauthorized
WWW-Authenticate: cookie; cookie-name=my-session-cookie-name

但是,现实世界的Internet浏览器(用户代理)并不真正支持这一点,根据我的经验,最糟糕的选择是对所有“访问拒绝”、“未经授权”或“不允许”使用HTTP status403。如果您有一个仅使用非浏览器用户代理访问的REST服务,您可以按照规范返回上述标头。

另请注意,如RFC 7231第6.5.4节所述(https://www.rfc-editor.org/rfc/rfc7231#section-6.5.4)服务器可以用404对“拒绝访问”和“未找到”做出响应,因此对于所有用户代理(浏览器和独立客户端),以下内容都可以:

403 Unauthorized or Not allowed

404 Access Denied or Not Found

或者,您可以在任何情况下使用400,因为这会导致浏览器退回到一般错误处理情况。HTTP状态码401尤其有问题,因为它在历史上意味着(至少在实践中)正在使用基本领域认证,并且提交的HTTP头授权未被接受。由于您无法通过常用浏览器的该标头提交会话cookie,因此当您使用cookie进行身份验证时,这些浏览器无法正确处理401。(根据规范,HTTP 401必须包含头文件,该头文件应用于确定用户代理的正确处理方式,但在浏览器中似乎不会发生这种情况。)

季稳
2023-03-14

由于这种类型的身份验证没有标准挑战,因此您(正如您自己预测的那样)正在发明自己的身份验证。

我认为这里没有指定供应商令牌的标准机制,所以我认为最好的办法是使用一个不太可能与其他任何东西冲突的令牌。

Amazon已经通过AWS做到了这一点,还有很多其他的。我的建议是使用productname-Schemename之类的东西,例如acme-webauth

嵇昱
2023-03-14

WWW-Authenticate标头值的正确值是什么?

当您未使用RFC 7235中描述的HTTP身份验证时,返回401WWW-Authenticate是没有意义的。在HTTP身份验证中,客户端应使用身份验证方案令牌发送请求的Authoration标头中的凭据。

如果要使用POST发送请求负载中的凭据,则403状态代码更适合指示服务器已拒绝请求。

 类似资料:
  • 问题内容: 在flask中,我使用以下代码段启用HTTP身份验证: 现在,根据我过去使用Flask的经验,如果某人的凭据不正确,我想让他们知道我可以打电话给: 这为你提供了基本的apache 401响应。有谁知道我如何使用上面的代码片段实现这一目标? 谢谢 问题答案: 在Flask中,自定义错误响应确实非常容易。创建一个仅将参数作为HTTP错误状态代码的函数,使其返回flask.Response实

  • 问题内容: 我正在使用Java访问HTTPS站点,该站点以XML格式返回显示内容。我在URL本身中传递了登录凭据。这是代码片段: 我正在程序中创建一个不验证签名/未签名证书的信任管理器。但是,在运行上面的程序时,出现错误服务器返回HTTP响应代码:401表示URL:https:// Administrator:Password @ localhost:8443 / abcd 我可以在浏览器中使用相

  • 这是我使用的授权标头: 以下是我使用的基本字符串: 以下是我的推特文档: 步骤1:获取特殊请求令牌 首先,您使用应用程序的使用者密钥向Twitter请求令牌URLhttps://api.twitter.com/oauth/request_token发出HTTPS请求。除了传统的oauth_*签名参数之外,您还必须包含设置为reverse_auth值的x_auth_mode。 例如,考虑使用令牌秘密

  • 我使用RestTemplate调用authenticate web服务并发布用户名和密码,作为回报,我需要从响应体获取令牌,但我找不到一个明确的方法。。这是我的密码 这是我需要从中获取令牌的响应主体:Web服务响应主体

  • 问题内容: Iam尝试对https URL进行身份验证,但Iam出现异常。下面是代码。 例外情况: 请任何人建议如何解决此问题。 问题答案: 401错误代码表示“未经授权”。我相信您的代码无法正确编码Authentication标头。假设服务器需要 基本访问身份验证, 则代码应如下所示: RFC 2617 中提供了HTTP基本和摘要身份验证方案的全面描述

  • java.io.ioException:服务器返回HTTP响应代码:406 for url:https://aa09616289afe6a25ea1f7f6fbf12073:shppa_f5fd47a653d49d886436578c54187@mfaisal1521.myshopify.com/admin/api/2020-04/products.json at sun.net.www.prot