SSOとスクリーニング済みIP

ログインとアカウント作成には SSO を使用しています。当フォーラムでは、他の方法でのログインや登録はできません。

ただし、スクリーニング済み IP アドレスのリストには、毎日自動的に数十の IP アドレスが追加されています。これは想定された動作でしょうか?IP アドレスがスクリーニング済み IP アドレスのリストに追加される条件は何ですか?

私が思いつく唯一の方法は、アカウントを削除して「スパマーを削除」ボタンを選択する場合です。

良い指摘です。API を通じてアカウントを削除する際に、IP が「スクリーン済み IP」に追加されているのが問題ですね。

ただし、block_ip=false を指定して DELETE リクエストを送信しています。これは Rails のログからの抜粋です。

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

それにもかかわらず IP がブロックされているため、どこかにバグがあるのかもしれません。

そうかもしれませんし、違うかもしれません。私が使用しているのは、発見した唯一の ユーザーの削除 エンドポイントです。

DELETE /admin/users/{id}.json

このエンドポイントには、デフォルトで true になっている block_ip パラメータがあり、私は常にこれを false に設定しています。それにもかかわらず、IP アドレスがスクリーニング済み IP に追加されてしまいます。

ユーザーを削除する際、または「削除のみ」というボタンを押す際に、どのリクエストが送信されるかを正確に確認するために、Reverse engineer the Discourse API を参照することをお勧めします。

削除後に IP アドレスがスクリーンリストに追加されているのが見える場合、それは間違いなく、スパマーとしてユーザーを削除している(つまり、中央のボタンである「削除かつブロック」を使用している)からです。

既にその対応は行っており、削除用の API エンドポイントが両方のアクション(削除のみ、削除&ブロック)で共通して使用されています。違いは、私が前述したパラメータ(block_ipblock_email など)にあります。

私のリクエストに問題があった原因をようやく特定できました。Discourse の API は、真偽値(truthy/falsy)ではなく、文字列の ‘true’ と ‘false’ を必要とします。ドキュメント にその注意書きがあったのに見落としていた私の不注意でした。

これがおそらく、この混乱を引き起こしていた原因でしょう。

早とちりしていたかもしれません。:disappointed_face:

truthy/falsy パラメータを ‘true’/‘false’ の文字列に修正しましたが、ユーザーを削除する際に「スクリーン済み IP」や「スクリーン済みメール」にエントリが追加される現象は依然として発生しています。

以下は、API 呼び出し時の Rails ログです。

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 ではなく Web インターフェース経由で実行した際の要求は以下の通りです。

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’ または ‘false’ に設定されているかに関わらず、存在する限り常に true として解釈されているようです。

その後、‘true’ のパラメータのみを設定し、‘false’ のパラメータは省略するようにしたところ、「スクリーン済み IP」や「スクリーン済みメール」へのエントリ追加は止まりました。

これは意図した動作でしょうか?ドキュメント で理解した内容とは異なりますが。

Reverse engineer the Discourse API のトピックに従って観測される動作をエミュレートしていれば、問題ありません。「delete only」ボタンを押したときに、ネットワークモニターでどのような API 呼び出しが観測されますか?

場合によっては、JS が明示的に false をサーバーに渡さない場合、サーバーは存在する値をすべて true として扱います。おそらく、ここで遭遇している問題もこれに該当するでしょう。