gpt4 book ai didi

angularjs - Django Rest Framework-尝试使用不正确的凭据登录用户时,为什么返回200状态代码?

转载 作者:行者123 更新时间:2023-12-01 08:53:53 25 4
gpt4 key购买 nike

这是我的URLs.py:

url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework')),

我的主页上有一个表格,用户可以在其中输入用户名和密码。单击提交按钮后,AngularJS使用用户对象(用户名和密码)将POST请求发送到“api-auth / login /”:
$http.post("/api-auth/login/", self.loginuser)
.error(function(data, status, headers, config) {
console.log(data);
});

当用户提交不正确的用户名和密码(不存在或不匹配的用户名和密码)时,Django Rest Framework返回200 OK,而不是204 No Content,404或401 Unauthorized(在该帖子上显示为401)是要返回的正确状态码: What's the appropriate HTTP status code to return if a user tries logging in with an incorrect username / password, but correct format?)。

根据此处的内容: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html在9.5节POST中,它说:“在这种情况下,根据响应是否包括描述结果的实体,200(确定)或204(无内容)是适当的响应状态。”

我处理错误并在数据存在的情况下记录数据(我在JS中做了console.log(data)),但是没有数据记录,这意味着(据我了解)没有数据发送/响应不包含描述以下内容的实体结果。

那么DjangoRestFramework为何返回200而不是204 No Content(或者404或401,这是我链接到的其他SO帖子应返回的内容)?

最佳答案

您的问题中有几件事混在一起。首先,您使用的技术观点,其次是您解释答案的方式。

1)视图

很快。通过将数据发送到/api-auth/login/来使用的视图,它是DRF的可登录API 的登录视图。该视图实际上是Django的auth应用程序(django.contrib.auth.views.login)附带的视图,假定该视图正在与用户打交道,并手动浏览API。

也就是说:使用GET调用会生成一个空的html表单,使用POST发送回该表单会触发表单验证,验证可能会以重新显示的表单(包含文档的200 Ok)或重定向回的形式结束(找到302为空内容)。

这就是为什么数据为空的原因:服务器发送HTML文档,而您的angular可能试图解析一些JSON对象。

绝对不希望从脚本中调用您使用的表单视图。可以这样做,但是您需要相应地处理结果,这意味着分析返回的html页面以查找错误消息。凌乱。

如果要从脚本轻松访问它,则应该构建自己的登录视图。

2)文档与请求

您在这里处理两个不同级别的语义。

  • 请求的含义。
  • 包含在请求中的文档的含义。

  • HTTP错误代码在请求的上下文中有意义。它们发生在较低级别。例如,返回401代码意味着“执行此请求之前需要有效的身份验证凭据”。

    因此,在这里,这基本上意味着“在我处理您的登录请求之前,您必须具有有效的身份验证凭证”。

    这可能是有道理的,但仅在您具有两层身份验证的情况下。在允许第二层登录请求通过之前,您需要具有对第一层有效的身份验证凭据。在这种情况下,如果您尝试使用第二层登录而第一层无法识别,则可能会收到401。

    那么,REST如何适应?

    REST的概念在应用于HTTP时,将尝试匹配请求级语义和文档级语义。它特别适合,因为每个REST概念都有一个匹配的HTTP动词,HTTP是可缓存的,客户端服务器,...和... 无状态

    无状态意味着HTTP和REST都没有登录的概念。登录是一种抽象,这通常意味着我们使用的工作流如下所示:
  • 我们对某些端点进行身份验证(登录/密码,质询,oauth等)。
  • 端点返回一些授权令牌
  • 我们将授权令牌与每个下一个请求一起发送到服务器。

  • 但是事实是,每个单个请求都必须由服务器授权。也就是说,服务器将始终先授权请求,然后再查看内部内容。如果该步骤失败,则401是适当的响应。

    除了步骤#1。该请求没有授权步骤。必须对其进行处理,必须检索和检查登录名/密码,并且服务器可能根据结果决定发回授权令牌,具体取决于结果。

    那么,如果选择不这样做,哪种错误代码将是合适的呢?好吧,有几种您可以选择:
  • 200好。登录请求已成功处理,并产生一条错误消息,这是包含结果的文档。然后,脚本将读取文档(例如,可以是JSON对象),以查看文档是否有错误或授权令牌。
  • 204没有内容。登录请求已成功处理,但未产生任何结果,当然也未产生任何授权令牌。奇怪的选择,但正确。
  • 400错误的请求。登录请求未成功处理。

  • 唯一确定的是,401不是一个选择。 401表示不允许您尝试登录。并非登录失败。

    关于angularjs - Django Rest Framework-尝试使用不正确的凭据登录用户时,为什么返回200状态代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32728935/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com