尝试未登录退出后返回的HTTP状态码是什么?

13
假设我有一个 RESTful 的身份验证端点:

http://example.com/api/v1/auth

  • 通过 POST 请求提供电子邮件和密码以登录。正确登录会得到 HTTP 200 响应,而错误登录则会得到 HTTP 403。
  • 通过 DELETE 请求进行注销操作。
很明显,在成功注销后,应该返回 HTTP 200。如果未登录的用户尝试注销,应该返回什么 HTTP 响应代码?

一个400级别可能是有意义的。 - Daniel A. White
2个回答

32
很明显,成功注销应该返回状态码200吗?并不是。如果您不使用该状态码返回响应,则204或205更适合(205 =“无内容,刷新”),因为没有内容可以返回,客户端可能需要刷新其视图。
如果用户未登录:考虑一下客户端会怎么想。要么客户端不知道用户未登录,要么客户端不确定用户是否未登录,并且为了安全起见退出登录。调用后,用户注销。给一个与以前已登录用户不同的状态有何用处呢?即使客户端正确检测到这种状态,客户端能做什么有用的吗?
我会给出完全相同的响应。不要将其看作“我已注销”,而应该将其视为“我未登录”。如果您真正想报告它,请针对已登录用户和未登录用户返回具有不同内容的状态码200。

1
我认为你应该只允许已验证的用户注销,否则有人可能会在随机页面上放置类似于<img src="https://your-service/logout" />的东西来注销用户。虽然在这里的问题中OP只使用DELETE请求,但仍然需要注意。 - handy

2
你的问题的简短回答是404。原因如下:DELETE意味着“删除由URL标识的资源”,因此对DELETE /api/v1/auth的成功请求应删除/api/v1/auth所标识的任何内容,导致随后的DELETE /api/v1/auth请求返回404 Not FoundDELETE的问题在于,理想情况下,/api/v1/auth(像任何其他URL一样)应该代表相同的资源,无论当前用户是否已登录以及已登录用户的身份如何;因此,如果一个用户请求服务器删除这个资源并接收到2xx响应,则任何用户之后的任何请求,包括登录和注销,都应该失败并返回404。
因此,我认为最好通过向两个不同的资源/api/v1/auth/login/api/v1/auth/logout进行POST来实现登录和注销。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接