# 登录失败返回 200 Ok

**URL:** https://meta.discourse.org/t/failed-login-returns-200-ok/276091
**Category:** Feature
**Created:** [2023年八月21日 20:11 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091 "2023-08-21T20:11:45Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![uckelman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/uckelman/32/103854_2.png) [@uckelman](https://meta.discourse.org/u/uckelman)
#### Post date: [2023年八月21日 20:11 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091/1 "2023-08-21T20:11:45Z")

</div>

我正在向 `/session.json` 发送一个 `POST` 请求，请求体为：

```plaintext
{
  "login": "skroob",
  "password": "12345",
  "authenticity_token": "..."
}

```

登录成功时，状态码为 200，返回的 JSON 包含大量用户数据。登录失败时，返回的 JSON 如下：

```plaintext
{"error": "Incorrect username, email or password"}

```

但状态码仍然是 200。这是一个 bug 吗？失败登录的状态码是否应该大于等于 400，以表示失败？

---

<div class="post-metadata">

### Author: ![maiki](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/maiki/32/233950_2.png) [@maiki](https://meta.discourse.org/u/maiki)
#### Post date: [2023年八月21日 23:04 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091/2 "2023-08-21T23:04:05Z")

</div>

> [@uckelman](#):
>
> 这是个bug吗？失败登录的状态码是否应该大于等于400，以表示失败？

🤔

也许吧。我可能会选择 [401](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401)。

但那些也是HTTP状态码，用于HTTP客户端连接；我认为这种细微差别会导致诸如返回200（“您的POST成功了，这是反馈”）之类的决定。

我自己也不确定。🙂

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [2023年八月21日 23:11 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091/3 "2023-08-21T23:11:11Z")

</div>

> [@uckelman](#):
>
> 但状态仍然是 200。这是一个 bug 吗？

> [@Log Invalid Login Attempts for Fail2ban and upstream server action](https://meta.discourse.org/t/log-invalid-login-attempts-for-fail2ban-and-upstream-server-action/171884/10?u=falco):
>
> Twitter uses 400 for wrong password, but Facebook, LinkedIn, Google and Amazon returns a 200. IMO a 200 sounds wrong, but it appears to be the “normal” thing? Maybe you can start with a plugin that hooks into this method here And does what you need?

---

<div class="post-metadata">

### Author: ![uckelman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/uckelman/32/103854_2.png) [@uckelman](https://meta.discourse.org/u/uckelman)
#### Post date: [2023年八月21日 23:38 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091/4 "2023-08-21T23:38:28Z")

</div>

我能理解为什么登录失败会返回 200，这意味着您的登录 _成功地_ 失败了，而不是 _不成功地_ 失败了。🙃

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2023年八月21日 23:59 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091/5 "2023-08-21T23:59:29Z")

</div>

请注意，这也是一种“功能”，因为它会混淆试图登录的机器人。

我对此是否要更改持保留态度。也许……

---

<div class="post-metadata">

### Author: ![uckelman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/uckelman/32/103854_2.png) [@uckelman](https://meta.discourse.org/u/uckelman)
#### Post date: [2023年八月22日 13:16 UTC](https://meta.discourse.org/t/failed-login-returns-200-ok/276091/6 "2023-08-22T13:16:45Z")

</div>

我不是在要求更改。我想要的是一种选择：更改，或者确认该行为是故意的——我现在已经得到了。谢谢！
