# SSO и разрешенные IP-адреса

**URL:** https://meta.discourse.org/t/sso-and-screened-ips/172638
**Category:** SSO
**Tags:** rest-api
**Created:** [08.Декабрь.2020 14:44:19 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638 "2020-12-08T14:44:19Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [08.Декабрь.2020 14:44:19 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/1 "2020-12-08T14:44:19Z")

</div>

Мы используем SSO для входа и создания учетных записей. Других способов входа или регистрации на нашем форуме нет.

Однако в списке заблокированных IP-адресов десятки записей, которые автоматически добавляются ежедневно. Это ожидаемое поведение? По каким причинам IP-адрес попадает в список заблокированных?

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [09.Декабрь.2020 18:26:42 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/2 "2020-12-09T18:26:42Z")

</div>

Единственный способ, о котором я могу подумать, — это когда вы удаляете аккаунт и выбираете кнопку «Удалить спамера».

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [09.Декабрь.2020 18:47:00 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/3 "2020-12-09T18:47:00Z")

</div>

Хорошая мысль — IP-адрес добавляется в список заблокированных (Screened IPs) именно тогда, когда мы удаляем аккаунт через API.

Однако мы отправляем запрос DELETE с параметром `block_ip=false`. Вот что записано в логах Rails:

```plaintext
Parameters: {"delete_posts"=>"1", "block_email"=>"0", "blocked_urls"=>"0", "block_ip"=>"0", "id"=>"123"}

```

Но IP-адреса всё равно блокируются. Возможно, где-то есть ошибка?

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [07.Июнь.2021 10:45:15 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/4 "2021-06-07T10:45:15Z")

</div>

> [@codinghorror](#):
>
> Кажется, вы вызываете функцию «удалить как спамера», которая автоматически добавляет IP-адрес и адрес электронной почты в чёрный список. Думаю, вам стоит пересмотреть этот код. Вам нужно «обычное удаление» согласно интерфейсу, а не «удаление как спамера».

Возможно, хотя я так не думаю? Я использую единственный найденный мной [endpoint для удаления пользователя](https://docs.discourse.org/#tag/Users/paths/~1admin~1users~1%7Bid%7D.json/delete):

`DELETE /admin/users/{id}.json`

У него есть параметр `block_ip`, который по умолчанию установлен в true, но я всегда устанавливаю его в false. Тем не менее IP-адреса всё равно добавляются в список отслеживаемых IP-адресов.

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [07.Июнь.2021 18:39:08 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/5 "2021-06-07T18:39:08Z")

</div>

Возможно, вам стоит воспользоваться ссылкой [Reverse engineer the Discourse API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576) и посмотреть, какие именно запросы отправляются при удалении пользователя, нажав на кнопку Только удалить

 ![image](https://global.discourse-cdn.com/meta/original/3X/2/0/204ce65bcda3ea4901121655c6c8c923ebab157a.png)

… потому что я могу с уверенностью сказать: если вы видите, что IP-адреса добавляются в список заблокированных после удаления, вы _точно_ удаляете пользователя как спамера, то есть нажимаете среднюю кнопку — удалить **и заблокировать**.

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [08.Июнь.2021 10:53:50 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/6 "2021-06-08T10:53:50Z")

</div>

Я уже делал это, и конечная точка API для удаления — это та, которую я использовал, причём она одинакова для обоих действий (только удаление и удаление с блокировкой). Единственное различие заключается в используемых с ней параметрах (`block_ip`, `block_email`, …), о которых я упомянул выше.

> [@mentalstring](#):
>
> Однако мы отправляем запрос DELETE с параметром `block_ip=false`. Это видно из логов Rails:
> 
> ```plaintext
> Parameters: {"delete_posts"=>"1", "block_email"=>"0", "blocked_urls"=>"0", "block_ip"=>"0", "id"=>"123"}
> 
> ```

Кажется, я наконец понял, в чём была проблема с моими запросами: API Discourse ожидает строки ‘true’ и ‘false’, а не истиные/ложные значения. Моя вина, что я не заметил об этом предупреждение в [документации](https://docs.discourse.org/).

Вероятно, именно это вызывало весь этот [хаос](https://meta.discourse.org/t/sso-and-blocked-ip-addresses/192588/6).

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [14.Июнь.2021 16:44:02 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/7 "2021-06-14T16:44:02Z")

</div>

Возможно, я поспешил с выводами. 😞

После того как я исправил параметры truthy/falsy на строки ‘true’/‘false’, при удалении пользователей всё ещё добавляются записи в списки «Заблокированные IP» и «Заблокированные email-адреса».

Вот логи Rails для вызова API:

```plaintext
Started DELETE "/admin/users/9553.json" for 123.123.123.123 at 2021-06-10 00:01:21 +0000
Processing by Admin::UsersController#destroy as JSON
  Parameters: {"delete_posts"=>"false", "block_email"=>"false", "blocked_urls"=>"false", "block_ip"=>"false", "id"=>"9553"}
Can't verify CSRF token authenticity.
  Rendering text template
  Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 418 in 8ms (Views: 1.4ms | ActiveRecord: 0.0ms | Allocations: 2301)

```

А вот запрос, выполненный через веб-интерфейс вместо вызова API:

```plaintext
Started DELETE "/admin/users/49.json" for 123.123.123.123 at 2021-06-10 08:24:47 +0000
Processing by Admin::UsersController#destroy as JSON
  Parameters: {"context"=>"/admin/users/49/XXX", "delete_posts"=>"true", "id"=>"49"}
  Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 418 in 23ms (Views: 4.7ms | ActiveRecord: 0.0ms | Allocations: 1778)

```

Таким образом, после нескольких тестов кажется, что параметры для конечной точки API `/admin/users/{id}.json` **всегда интерпретируются как true** , если они присутствуют, независимо от того, установлены ли они фактически в ‘true’ или ‘false’?

Как только я начал передавать только параметры со значением ‘true’, пропуская те, что равны ‘false’, записи больше не добавляются в списки «Заблокированные IP» и «Заблокированные email-адреса».

Это ожидаемое поведение? Это не соответствует тому, что я понял из [документации](https://docs.discourse.org/#tag/Users/paths/~1admin~1users~1%7Bid%7D.json/delete).

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [14.Июнь.2021 17:53:12 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/8 "2021-06-14T17:53:12Z")

</div>

Пока вы эмулируете поведение, которое наблюдается при следовании теме [Reverse engineer the Discourse API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576), у вас всё будет в порядке. Какие вызовы API вы наблюдаете в мониторе сети при нажатии кнопки «Удалить только»?

---

<div class="post-metadata">

### Author: ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)
#### Post date: [14.Июнь.2021 18:07:48 UTC](https://meta.discourse.org/t/sso-and-screened-ips/172638/9 "2021-06-14T18:07:48Z")

</div>

В некоторых случаях, когда JS явно не передаёт `false` на сервер, сервер считает любое присутствующее значение истинным. Вероятно, именно с этим вы столкнулись здесь.
