使用 form-based 身份验证时,HTTP 服务器 return 在 401 响应中应该 WWW-Authenticate header 什么?
What WWW-Authenticate header should a http server return in a 401 response when using form-based authentication?
我在浏览器上有一个带有 Javascript 部分 运行 的 Web 应用程序。该前端使用多个 HTTP 端点(或多或少的 REST)。前端必须能够区分 401
和 403
响应,并且不得接收通常用于人类用户的 3xx
重定向。
授权是通过普通表单登录完成的(那里不涉及 Javascript),然后使用 session cookie(用于“REST”和正常请求)。
WWW-Authenticate
header 值的正确值是多少?
来自 RFC 7235:“生成 401(未授权)响应的服务器必须发送包含至少一个挑战的 WWW-Authenticate header 字段。”
Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry 未列出任何 form-based 身份验证方案。
另请参阅:
没有用于基于表单的身份验证的 HTTP 身份验证方案。
浏览器通过显示一个可以输入凭据的弹出窗口来实现 basic、digest 等。
由于这种类型的身份验证没有标准质询,您正在(正如您自己预测的那样)发明自己的质询。
我认为这里没有用于指定供应商令牌的标准机制,所以我认为您能做的最好的事情就是使用不太可能与其他任何东西冲突的令牌。
Amazon 已经通过 AWS
做到了这一点,还有很多其他的。我的建议是使用 productname-schemename
之类的东西,例如 acme-webauth
.
What would be a correct value for the WWW-Authenticate
header value?
返回 401
and WWW-Authenticate
when you are not using HTTP Authentication as described in the RFC 7235. In HTTP Authentication, the client is expected to send the credentials in the Authorization
header of the request with an authentication scheme 令牌没有意义。
理论上你应该回应
HTTP/1.x 401 Unauthorized
WWW-Authenticate: cookie; cookie-name=my-session-cookie-name
然而,现实世界的互联网浏览器(用户代理)并不真正支持这个,根据我的经验,最不坏的选择是为所有的人使用 HTTP 状态 403
“拒绝访问”、“未经授权”或“不允许”。如果您的 REST 服务 仅通过 non-browser user-agents 访问,您可以只遵循规范 return 以上 header s.
另请注意,如 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 特别有问题,因为它在历史上(至少在实践中)意味着 Basic Realm
身份验证正在使用并且提交的 HTTP header Authorization
未被接受。因为您不能通过 header 使用常用浏览器提交 session cookie,所以当您使用 cookie 进行身份验证时,这些浏览器无法正确处理 401。 (根据规范,HTTP 401 MUST
include header WWW-Authenticate
应该用于确定用户代理的正确处理,但这在浏览器中似乎并没有发生。)
我在浏览器上有一个带有 Javascript 部分 运行 的 Web 应用程序。该前端使用多个 HTTP 端点(或多或少的 REST)。前端必须能够区分 401
和 403
响应,并且不得接收通常用于人类用户的 3xx
重定向。
授权是通过普通表单登录完成的(那里不涉及 Javascript),然后使用 session cookie(用于“REST”和正常请求)。
WWW-Authenticate
header 值的正确值是多少?
来自 RFC 7235:“生成 401(未授权)响应的服务器必须发送包含至少一个挑战的 WWW-Authenticate header 字段。”
Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry 未列出任何 form-based 身份验证方案。
另请参阅:
没有用于基于表单的身份验证的 HTTP 身份验证方案。 浏览器通过显示一个可以输入凭据的弹出窗口来实现 basic、digest 等。
由于这种类型的身份验证没有标准质询,您正在(正如您自己预测的那样)发明自己的质询。
我认为这里没有用于指定供应商令牌的标准机制,所以我认为您能做的最好的事情就是使用不太可能与其他任何东西冲突的令牌。
Amazon 已经通过 AWS
做到了这一点,还有很多其他的。我的建议是使用 productname-schemename
之类的东西,例如 acme-webauth
.
What would be a correct value for the
WWW-Authenticate
header value?
返回 401
and WWW-Authenticate
when you are not using HTTP Authentication as described in the RFC 7235. In HTTP Authentication, the client is expected to send the credentials in the Authorization
header of the request with an authentication scheme 令牌没有意义。
理论上你应该回应
HTTP/1.x 401 Unauthorized
WWW-Authenticate: cookie; cookie-name=my-session-cookie-name
然而,现实世界的互联网浏览器(用户代理)并不真正支持这个,根据我的经验,最不坏的选择是为所有的人使用 HTTP 状态 403
“拒绝访问”、“未经授权”或“不允许”。如果您的 REST 服务 仅通过 non-browser user-agents 访问,您可以只遵循规范 return 以上 header s.
另请注意,如 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 特别有问题,因为它在历史上(至少在实践中)意味着 Basic Realm
身份验证正在使用并且提交的 HTTP header Authorization
未被接受。因为您不能通过 header 使用常用浏览器提交 session cookie,所以当您使用 cookie 进行身份验证时,这些浏览器无法正确处理 401。 (根据规范,HTTP 401 MUST
include header WWW-Authenticate
应该用于确定用户代理的正确处理,但这在浏览器中似乎并没有发生。)