ユーザーが誰かわからない場合、ログアウトさせるには?

はい、シンプルなシナリオを想定してみましょう:

  1. ユーザーAが当サイトにログインし、「フォーラム」をクリックします。ユーザーはDiscourseにリダイレクトされ、DiscourseがSSOを通じて当サイトにコールバックを行うことで認証され、自動的にDiscourseにログインします。問題なく動作しています。

  2. しばらく経過後、ユーザーAがコンピューターから離れ、セッションが自動的に期限切れになります。ユーザーAは当アプリまたはDiscourseで明示的に「ログアウト」をクリックしていません。

  3. ユーザーBが同じデバイスで当サイトにログインし、フォーラムへ移動しようとクリックします。Discourse側ではまだユーザーAがログインした状態であるため、SSOの呼び出しが行われません。その結果、ユーザーBはユーザーAとしてDiscourseにログインしてしまいます。:ー\

このシナリオをどのように処理すればよいでしょうか?

よろしくお願いいたします、
エリック

Discourse を自動的にログアウトさせるために、API 呼び出しをフックアップできます:

はい、でもユーザーがコンピューターから離れてセッションが切れてしまった場合、どうすればいいのでしょうか?もしかしたらこれは、私のメインサイトが PHP で書かれていることから、PHP の質問かもしれませんね…

このテクニックは引き続き機能するはずです:

@riking 申し訳ありませんが、ちょっと気になった質問があります。

Auth0 のようなサービスは、Discourse での自動ログアウトをどのように処理しているのでしょうか?

この点についてもう少し詳しく教えていただけますか?あなたのアプリのセッションの有効期限はどのくらいですか?セッションの期限切れはどのように処理していますか?

Discourseには「最大セッション期間」という設定があり、デフォルトでは1440時間(60日)に設定されています。

結論から言うと、パソコンの前にいるユーザーが入れ替わったかどうかを把握できない限り、それを防ぐ簡単な方法はありません。セッションの有効期限を短く設定するか、アプリから定期的にログアウトを呼び出すこともできますが、その場合、ユーザーが長時間パソコンを使用していると、認証フローを再度通過する必要が出てきてしまいます。

Discourseは現在利用しているログインおよびセッションフローを拡張できますが、上記の詳細が不明なため、問題の所在や改善の機会を特定するのは難しい状況です。

返信ありがとうございます!この問題は結局、メインサイトでのユーザー管理に尽きることに気づきました。

ユーザーがメインサイトから手動でログアウトした場合、Discourse(API経由)を呼び出して、そちらでもログアウトさせる必要があります。

また、ユーザーがログアウトしなくてもセッションが切れた場合、同時にDiscourse側でもログアウトさせるために呼び出す必要があります。

最後に:ユーザーがDiscourseで「ログアウト」をクリックしてログアウトした場合、そのイベントを(Webhook経由で)捕捉し、こちらのサイトでもログアウトさせる必要があります。

さあ、統合だ!