RESTfullogin失败:返回401或自定义响应
这是一个概念性的问题。
我有一个客户端(移动)应用程序需要支持REST风格的Web服务的login操作。 因为Web服务是RESTful的,所以这相当于客户端接受用户的用户名/密码,用服务validation用户名/密码,然后只记得发送所有后续请求的用户名/密码。
此Web服务中的所有其他响应均以JSON格式提供。
问题是,当我查询Web服务只是为了找出给定的用户名/密码是否有效时,Web服务是否总是以JSON数据响应告诉我它成功或不成功,还是应该以良好的凭证和HTTP返回HTTP 200 401凭证不好。
我要问的原因是,有些其他RESTful服务使用401作为错误的凭据,即使您只是询问凭据是否有效。 然而,我对401响应的理解是,它们代表了一个资源,如果没有有效的证书,就不应该访问它。 但是login资源应该可以被任何人访问,因为login资源的全部目的是告诉你你的凭证是否有效。
换句话说,在我看来,像这样的一个请求:
myservice.com/this/is/a/user/action
如果提供的证书不正确,应该返回401。 但是一个请求,如:
myservice.com/are/these/credentials/valid
不应该返回401,因为该特定的URL(请求)被授权有或没有有效的凭证。
我想在这方面听到一些合理的意见。 处理这个问题的标准方法是什么,是处理这个逻辑上合适的标准方法?
首先, 401是发生失败login时发送的正确响应代码。
401未经授权类似于403 Forbidden,但专门用于需要authentication且失败或尚未提供的情况。 响应必须包含一个WWW-Authenticate标题字段,其中包含适用于所请求资源的挑战。
您的困惑, myservice.com/are/these/credentials/valid
发送401当你只是做一个检查,我认为是基于这样的事实,在REST布尔请求往往是错误的RESTful约束。 每个请求都应该返回一个资源。 在REST风格的服务中做布尔问题是RPC的一个难题。
现在我不知道你看到的服务是如何performance的。 但解决这个问题的一个好方法就是拥有一个类似于Account对象的东西,以便尝试GET。 如果你的凭证是正确的,你将得到Account对象,如果你不想浪费带宽只是为了“检查”,你可以在同一个资源上做HEAD。
一个账户对象也是一个不错的地方存储所有讨厌的布尔值,否则将是棘手的创造个人资源。