我正在设计一个RESTful API,其中一些调用是通过HTTP公开的,有些需要API密钥和HTTPS加密。我正在考虑如果HTTP请求被发送到其中一个私有资源,应该发送什么响应代码。到目前为止,唯一突然出现的是 412 - Precondition Failed ,但标准表明前提是由请求者而不是服务器强加的。
这种情况是否有适当的响应代码,或者我只是需要放弃并执行 400 ?
答案 0 :(得分:27)
我不能说这是否被HTTP客户广泛接受,但严格来说是RFC,服务器应该回复:
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
答案 1 :(得分:6)
要返回的相应错误代码与403.4 - SSL required类似。
虽然未在RFC for HTTP 1.1中明确记录,但此行为符合其中列出的要求:
服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)。
在某些情况下,添加自己的子代码(与SSL示例一样)可能会有所帮助,但由于此子代码对第三方没有意义,我建议不要使用它。
因此,您的最终错误消息将类似于“403 - 私有资源”。请注意,即使在缺少API密钥的情况下,也不应使用“401 - Unauthorized”,除非您的API密钥实际上可以在WWW-Authenticate头字段中传输。
答案 2 :(得分:6)
强制HTTP客户端使用HTTPS的最安全方法是HTTP Strict Transport Security。
以前常见的建议是放弃连接,但是practice has been removed in favor of HSTS(OWASP网站)。
答案 3 :(得分:4)
使用原因词组“ HTTPS必需”返回 403 似乎是一个实用的选项和我使用的内容。
请参阅https://en.wikipedia.org/wiki/HTTP_403
重定向REST Api并不是一个好主意,尤其是因为您可能不知道如何或什么消耗您的服务。
答案 4 :(得分:0)
只需将重定向发送到相应的https:URI。
<强>更新强>
这是一个错误的答案 - 见下面的评论