ふむ。ユーザーがフォーラムを利用し、トピックを読むなどして、投稿の作成(create_post)、トピックの作成(create_topic)、投稿の編集(edit_post)など、何らかのアクションを起こすと、Webhook を通じて通知が届きます。これにより、メインサイトはユーザーがまだアクティブであると判断し、セッションの「最終クリック」値を更新してログアウトを防ぐことができます。これは本来の動作通りで、問題ありません。
しかし、メンバーが単にメッセージを読み続けているだけの場合、Discourse のアイドル時間はリセットされます(これは良いことです)が、メインサイトにはユーザーがアクティブであることを示す Webhook メッセージが一切届きません。そのため、1 時間何のアクションも取らないと(フォーラムに行って PC から離れてしまったように見える)、メインサイトはユーザーが切れたと判断し、ログアウトしてしまいます。
ここにはロジック上の穴があるように思えます。適切な SSO 実装を行うのであれば、Discourse からユーザーのセッションがアクティブかどうか(単に閲覧しているだけでも)を通知する仕組みがあるべきではないでしょうか?例えば、メンバーがアクティブだが他の Webhook メッセージを生成していない場合に、5 分ごとにピングを送信するなどの対応が考えられます。
あるいは、私のサイト側でユーザーのタイムアウトを判断した時点で、Discourse に問い合わせて、そちらでユーザーがアクティブかどうかを確認する方法もあるかもしれません。そのようなことは可能でしょうか?(Is there an endpoint to check if a user is logged in - #3 by pfaffman という記事を見つけましたが、これが求めているものかどうかはっきりせず、/session/current.json は API ドキュメントに記載されていません。)ただし、これでは API 呼び出しが膨大になってしまいます。私のサイトでは、アイドル状態により毎分約 15〜20 人のユーザーをログアウトさせているため、その都度呼び出しを行うことになり、Discourse ID のローカルキャッシュがない場合はさらに多くの呼び出しが必要になる可能性があります。
皆さん、どのようにお考えですか?アドバイスをお願いします。