2012-07-30 38 views
55

这是一个概念性问题。RESTful登录失败:返回401或自定义响应

我有一个客户端(移动)应用程序,它需要支持针对RESTful Web服务的登录操作。因为Web服务是RESTful的,所以这相当于客户端接受用户的用户名/密码,用服务验证用户名/密码,然后只记得将所有后续请求发送给用户名/密码。

此Web服务中的所有其他响应均以JSON格式提供。

问题是,当我查询Web服务时,只是为了找出给定的用户名/密码是否有效,Web服务是否总是以JSON数据响应告诉我它成功或失败,或者是否应该返回HTTP 200良好的凭证和HTTP 401凭证不良。

我问的原因是,即使您只是询问凭据是否有效,其他一些RESTful服务也会使用401作为错误凭据。但是,我对401响应的理解是,它们代表的是一种资源,如果没有有效的凭据,您将无法访问该资源。但是登录资源应该是任何人都可以访问的,因为登录资源的全部用途是告诉你你的凭证是否有效。

换句话说,在我看来,像一个请求:

myservice.com/this/is/a/user/action 

应该返回401,如果提供不正确的凭据。但一个请求,如:

myservice.com/are/these/credentials/valid 

永远不应该返回401,因为该特定的URL(请求)被授权有或没有有效凭证。

我想听到一些有道理的意见。处理这种情况的标准方式是什么,并且是处理这种逻辑合适的标准方式?

回答

71

首先。 401是发生失败登录时发送的正确响应代码。

401未授权 类似403禁止,但专为当需要验证和已发生故障或尚未提供使用。响应必须包含一个WWW-Authenticate标头字段,其中包含适用于所请求资源的挑战。

你一下,myservice.com/are/these/credentials/valid混乱回送401时,你只是做了检查,我认为这是基于这样的事实,这样做在REST布尔请求往往是错误的REST式的约束。每个请求都应该返回一个资源。在REST风格的服务中做布尔问题是RPC的一个难题。

现在我不知道你看到的服务是如何表现的。但解决这个问题的一个好方法就是拥有类似Account对象的东西,以便尝试GET。如果您的凭证是正确的,您将获得Account对象,如果您不想为了“检查”而浪费带宽,则可以在相同的资源上执行HEAD。

一个帐户对象也是一个不错的地方来存储所有那些讨厌的布尔值,否则将创建个人资源非常棘手。

+1

你关于返回资源的观点似乎有效,也许这是正确的举措。至于说401是正确的回应,我会很感激那里的一些解释。我已经阅读了HTTP规范,就像你在这里所包含的那样,但对我而言,这并不是对你的断言的直接而明显的确认。也就是说,认证不需要询问认证的有效性 - 但是你所包含的内容是“专门用于需要认证时使用”。 – Matt 2012-07-30 04:21:55

+2

你的看法是正确的。您无需进行身份验证即可查询您的账户对象。但是,您需要成功进行身份验证才能够接收资源,并且需要进行身份验证,失败或尚未提供的身份验证,因为您不要求提供凭证的有效性,但是对于特定资源根据您提供的凭据。 – Cleric 2012-07-30 04:31:22

+0

对,我猜我的含义不明确。如果一个账户资源被退还,我在你的同一页面 - 我同意你的立场。当我再次询问401时,我的意思只是针对我要求有效性的情况。我知道这是来自REST方法的“错误”,但我只想为这个问题得出结论。因此,如果我做错了错误的事情并要求有效性作为布尔返回,那么返回401是否不合适,因为该请求/查询实际上不需要身份验证? – Matt 2012-07-30 07:23:16

相关问题