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