Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http RESTful登录失败:返回401或自定义响应_Http_Rest_Login_Http Response Codes - Fatal编程技术网

Http RESTful登录失败:返回401或自定义响应

Http RESTful登录失败:返回401或自定义响应,http,rest,login,http-response-codes,Http,Rest,Login,Http Response Codes,这是一个概念性问题 我有一个客户端(移动)应用程序,它需要支持针对RESTful web服务的登录操作。由于web服务是RESTful的,这相当于客户机接受用户的用户名/密码,用服务验证该用户名/密码,然后记住在所有后续请求中发送该用户名/密码 此web服务中的所有其他响应都以JSON格式提供 问题是,当我查询web服务只是为了确定给定的用户名/密码是否有效时,web服务是否总是用JSON数据响应,告诉我它成功或不成功,或者它是否应该在良好凭据上返回HTTP 200,在不良凭据上返回HTTP 4

这是一个概念性问题

我有一个客户端(移动)应用程序,它需要支持针对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(请求)已使用或不使用有效凭据进行授权


我想听一些有道理的意见。处理此问题的标准方法是什么?处理此问题的标准方法在逻辑上是否合适?

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

401未经授权 类似于403禁止,但专门用于需要身份验证且已失败或尚未提供身份验证的情况。响应必须包括WWW Authenticate标头字段,其中包含适用于请求的资源的质询

我认为,当你只是做一个检查时,你对,
myservice.com/are/this/credentials/valid
发回401的困惑是基于这样一个事实,即在REST中执行布尔请求通常由于RESTful约束是错误的。每个请求都应该返回一个资源。在RESTful服务中执行布尔问题是通往RPC的一个艰难过程

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


Account对象也是一个很好的存储所有那些讨厌的布尔值的地方,否则很难为这些布尔值创建单独的资源。

401应该只在请求需要授权头字段且授权失败时发送。由于登录API不需要授权,因此我认为401是错误的错误代码

按照这里的标准

*10.4.2未经授权


请求需要用户身份验证。响应必须包括WWW Authenticate标头字段(第14.47节),其中包含适用于请求资源的质询。客户可以使用合适的授权标头字段重复请求(第14.8节)。如果请求已包括授权凭据,则401响应表示已拒绝这些凭据的授权。如果401响应包含与先前响应相同的质询,并且用户代理已至少尝试了一次身份验证,则应向用户呈现响应中给出的实体,因为该实体可能包括相关诊断信息。HTTP访问身份验证在“HTTP身份验证:基本和摘要访问身份验证”[43]中进行了解释。*

返回409,并返回正确的错误消息。

如果401响应代码对用户身份验证有误导性,API可以发送HTTP状态代码200 OK,用于成功和失败的身份验证,但在身份验证成功响应上设置一个自定义头,并在登录失败时忽略该头

客户端可以检查头是否存在并决定操作

示例:SpringBoot API响应

登录成功时对OK的调用将标题“gotyouin”设置为一个值(任意值)。调用failed不会添加标头,客户端可以将其视为失败的登录尝试

public class LoginResponseEntityHelper {
   public static ResponseEntity<?> ok(String token) {
       return ResponseEntity.status(HttpStatus.OK).header("gotyouin", token).body(null);
    }

    public static ResponseEntity<?> failed() {
        return ResponseEntity.status(HttpStatus.OK).body(null);
    }}
公共类LoginResponseEntityHelper{
公共静态响应属性ok(字符串标记){
返回ResponseEntity.status(HttpStatus.OK).header(“gotyouin”,token).body(null);
}
公共静态响应失败(){
返回ResponseEntity.status(HttpStatus.OK).body(null);
}}

您关于返回资源的观点似乎是正确的,也许这是正确的做法。至于说401是正确的回答,我希望有一些解释。我已经阅读了HTTP规范,正如您在这里所包含的,但对我来说,这并不是对您的断言的直接和明显的确认。也就是说,认证不需要询问凭证的有效性,但您所包含的内容表明“在需要认证时专门使用”。您看待它的方式是正确的。您不需要经过身份验证就可以请求帐户对象。但是您需要成功地进行身份验证才能接收资源,而这正是
身份验证所必需且已失败或尚未提供的地方
适用,因为您不要求凭据的有效性,而是要求基于您提供的凭据的特定资源。我理解您为什么要进行“检查呼叫”为此,我仍然会推荐401作为适当的响应代码