【问题标题】:What HTTP code should I use for a third party authentication failure?对于第三方身份验证失败,我应该使用什么 HTTP 代码?
【发布时间】:2019-11-19 23:36:01
【问题描述】:

我正在创建一个与第三方应用程序集成的应用程序。

为此,登录用户提交一个 API 密钥用于第三方集成。

如果他们提交的 API 密钥无效 -(并从第三方返回 401),我应该返回哪个 HTTP 响应?

从我的应用程序返回 401 听起来令人困惑,因为从前端的角度来看,不清楚它们是否未经我的应用程序或第三方应用程序的身份验证。

我很想给它一个 400 - 好像他们提交了一个包含无效电子邮件地址等的表单。

【问题讨论】:

    标签: http-status-codes


    【解决方案1】:

    如果我必须选择一个代码,我可能会选择返回 403 Forbidden。

    RFC 7231 §6.5.3描述403代码如下:

    403(Forbidden)状态码表示服务器理解请求但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应负载(如果有)中描述该原因。

    如果请求中提供了身份验证凭据,服务器会认为它们不足以授予访问权限。客户端不应使用相同的凭据自动重复请求。客户端可以使用新的或不同的凭据重复请求。但是,由于与凭据无关的原因,可能会禁止请求。

    希望“隐藏”当前存在的禁止目标资源的源服务器可以改为响应状态码 404(未找到)。

    此状态代码通常用作通用的“身份验证失败”响应,并且不太可能触发任何特定的身份验证机制,例如 401 可以强制浏览器显示用户名/密码提示。身份验证失败的具体原因可以在响应正文中描述,可以是机器可读的形式(例如 JSON 或 XML),也可以是人类可读的文档(例如 HTML)。

    代码 400 在这里并不是最糟糕的选择,但它相当通用。

    【讨论】:

      【解决方案2】:

      您可以使用状态码 HTTP 状态码 - 407(需要代理身份验证)。来自Mozilla Developers Reference

      HTTP 407 Proxy Authentication Required 客户端错误状态 响应码表示请求没有被应用,因为 它缺少代理服务器的有效身份验证凭据 在浏览器和可以访问请求的服务器之间 资源。

      您的后端应用程序就像 3rd 方 API 的代理,因此在这种情况下使用 407 是可以的。

      【讨论】:

      • 同一页面指出:“此状态是通过包含有关如何正确授权的信息的 Proxy-Authenticate 标头发送的。”你觉得里面应该放什么? RFC 7235 还说“客户端可以使用新的或替换的 Proxy-Authorization 标头字段重复请求”,因此它看起来像是一个非常具体的机制的一部分,不适用于询问者的情况。
      • “...在浏览器和可以访问所请求资源的服务器之间的代理服务器”与 OP 描述的情况不太一样。如果 OP 自己的服务无法对从 3rd 方服务请求资源的用户进行身份验证,这将适用...
      【解决方案3】:

      407 不正确。在这种情况下,您的代码是代理,并且已通过身份验证。这是一个未经身份验证的外部系统。

      401 是合理的,但由于客户端已通过您的系统身份验证,因此对于未通过身份验证的内容具有误导性。如果您的外国身份验证被推迟到 100Continue 之后,这也不起作用。

      400 不正确,因为请求在格式上是有效的,但在外部代理处验证失败。

      所有其他 4xx 响应很容易被忽略,因为这里不适用。

      所以,剩下的 403 Forbidden 在我看来是你在这种情况下唯一真正的选择:

      403禁止 客户无权访问内容;也就是说,它是未经授权的,因此服务器拒绝提供所请求的资源。与 401 不同,客户端的身份为服务器所知。在这种情况下,也可以使用指示故障“根本原因”的状态消息进行响应。这实际上取决于您的应用程序的安全性。

      我的 $.02

      【讨论】:

        【解决方案4】:

        我会选择 400,它符合语义要求。用户提供了一些不良数据。正如您所说,401 / 403 表示用户与您的网站之间存在问题,而不是您的网站和其他应用程序之间存在问题。

        HTTP 1.1 RFC 的第 1 节指出:

        简介

        每个超文本传输​​协议 (HTTP) 消息都是一个请求 或回应。服务器侦听请求的连接, 解析收到的每条消息,解释消息语义 与已识别的请求目标相关,并对其做出响应 带有一个或多个响应消息的请求。客户端构造 请求消息以传达特定意图,检查 收到回复以查看意图是否得到执行,并且 决定如何解释结果。本文件定义 架构方面的 HTTP/1.1 请求和响应语义 在 [RFC7230] 中定义。

        因此,状态码的定义是在客户端和服务器之间。对我来说,这意味着选择对其他(服务器到服务器、后端等)交互最有意义的一个。

        这里提供的所有其他异国情调只会让服务的消费者感到困惑。

        【讨论】:

          【解决方案5】:

          发送 403 总是好的

          但如果需要,您可以添加 json 信息-

          [Serializable]
          [DataContract]
          class Response
          {
              [DataMember]
              public bool IsSuccess { get; set; }
              [DataMember]
              public string Message { get; set; }
              [DataMember]
              public object ResponseData { get; set; }
          
              public Response(bool status, string message, object data)
              {
                  IsSuccess = status;
                  Message = message;
                  ResponseData = data;
              }
          }
          

          然后在响应中添加以下信息

           return Json(new Response(false, "Login Failed, The user name or password provided is incorrect.", null));
          

          发出请求时,您可以禁用登录按钮 - 并且只有在进行更新时才能启用该按钮 - 客户端逻辑。

          【讨论】:

            【解决方案6】:

            424 - Failed Dependency 非常适合这种情况。

            424(依赖失败)状态码表示无法对资源执行该方法,因为请求的操作依赖于另一个操作并且该操作失败。

            【讨论】:

            【解决方案7】:

            我会倾向于 407。 407 需要代理身份验证 此代码类似于 401(未授权),但表示客户端必须首先通过代理验证自己。代理必须返回一个 Proxy-Authenticate 头字段(第 14.33 节),其中包含适用于所请求资源的代理的质询。客户端可以使用合适的 Proxy-Authorization 头域(第 14.34 节)重复请求。 HTTP 访问身份验证在“HTTP 身份验证:基本和摘要式访问身份验证”中进行了说明。 正如 Iskander 所提到的。

            它最好地向用户提示问题可能是什么。您也可以继续执行代理授权标头以完全符合规范。

            使用 400 会让您的客户在构建请求时摸不着头脑,寻找他做错了什么。

            使用 401 或 403 将它们保留用于您自己的 API 身份验证和授权更有意义。

            502 提示用户问题出在上游,因此在您修复它之前,他可能会被挂起。

            【讨论】:

              【解决方案8】:

              我会支持 401 。 401 Unauthorized 错误是一个 HTTP 状态代码,表示用户尝试访问的页面在用户首次使用有效的用户 ID 和密码登录之前无法加载。如果用户刚刚登录并收到 401 Unauthorized 错误,则表示用户输入的凭据由于某种原因无效。在我们的例子中,他们提交的 API 密钥是无效的。当我对错误代码感到困惑时,我正在使用一个活动图。

              以下是相同的链接:

              https://i.stack.imgur.com/ppsbq.jpg

              【讨论】:

                【解决方案9】:

                在这种情况下,中间服务器已经成功登录,上游服务器以无效密钥拒绝完成认证。似乎 502 代码(坏网关)适合这种情况,因为此代码代表充当网关(您的)并从上游服务器(第三方)接收无效响应的服务器。

                【讨论】:

                • 5xx 绝对不是这里的正确答案。这是用户错误,而不是服务器错误。
                猜你喜欢
                • 1970-01-01
                • 2020-12-27
                • 1970-01-01
                • 2011-01-30
                • 1970-01-01
                • 1970-01-01
                • 2015-05-09
                • 2021-06-19
                • 1970-01-01
                相关资源
                最近更新 更多