我正在设计一个RESTful API,其中一些调用是通过HTTP公开的,而一些需要API密钥和HTTPS加密。 我在考虑如果私有资源接收到HTTP请求时应该发送哪个响应代码。目前唯一显眼的是412 - 先决条件失败,但标准指出先决条件由请求者而不是服务器强加。
是否有适当的响应代码来处理这种情况,还是我只需要采用400?
我正在设计一个RESTful API,其中一些调用是通过HTTP公开的,而一些需要API密钥和HTTPS加密。 我在考虑如果私有资源接收到HTTP请求时应该发送哪个响应代码。目前唯一显眼的是412 - 先决条件失败,但标准指出先决条件由请求者而不是服务器强加。
是否有适当的响应代码来处理这种情况,还是我只需要采用400?
我不知道这是否被HTTP客户端广泛接受,但严格按照RFC规范,服务器应该做出如下响应:
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
强制HTTP客户端使用HTTPS的最安全方法是HTTP严格传输安全。
以前常见的建议是断开连接,但这种做法已被OWASP网站所支持的HSTS取代(参见)。
因此,您最终的错误消息应该像“403-私有资源”这样。请注意,即使在缺少API密钥的情况下,“401-未经授权”也不应该被使用,除非您的API密钥实际上可以通过WWW-Authenticate头字段传输。
只需发送重定向到相应的https: URI。
更新
这是一个错误的答案 - 请参见下面的评论
https
是在 RFC 2818 中规定的(基于 TLS 的 HTTP)。RFC 2817 几乎不会被使用。请注意,IETF 规范将 TLS 称为“TLS”,因为它是一个 IETF 标准(而 SSL 不是):你可以很容易地阅读所有这些规范并以“SSL”为标准(除了确实指向早期版本)。RFC 2817 并不是升级到 TLS(1.x)从 SSLv3,它是关于在同一连接上从纯文本 HTTP 升级到 SSL/TLS 的。 - Bruno