pnoeric
(Eric)
1
はい、シンプルなシナリオを想定してみましょう:
-
ユーザーAが当サイトにログインし、「フォーラム」をクリックします。ユーザーはDiscourseにリダイレクトされ、DiscourseがSSOを通じて当サイトにコールバックを行うことで認証され、自動的にDiscourseにログインします。問題なく動作しています。
-
しばらく経過後、ユーザーAがコンピューターから離れ、セッションが自動的に期限切れになります。ユーザーAは当アプリまたはDiscourseで明示的に「ログアウト」をクリックしていません。
-
ユーザーBが同じデバイスで当サイトにログインし、フォーラムへ移動しようとクリックします。Discourse側ではまだユーザーAがログインした状態であるため、SSOの呼び出しが行われません。その結果、ユーザーBはユーザーAとしてDiscourseにログインしてしまいます。:ー\
このシナリオをどのように処理すればよいでしょうか?
よろしくお願いいたします、
エリック
Discourse を自動的にログアウトさせるために、API 呼び出しをフックアップできます:
pnoeric
(Eric)
3
はい、でもユーザーがコンピューターから離れてセッションが切れてしまった場合、どうすればいいのでしょうか?もしかしたらこれは、私のメインサイトが PHP で書かれていることから、PHP の質問かもしれませんね…
@riking 申し訳ありませんが、ちょっと気になった質問があります。
Auth0 のようなサービスは、Discourse での自動ログアウトをどのように処理しているのでしょうか?
Stephen
(Stephen)
6
この点についてもう少し詳しく教えていただけますか?あなたのアプリのセッションの有効期限はどのくらいですか?セッションの期限切れはどのように処理していますか?
Discourseには「最大セッション期間」という設定があり、デフォルトでは1440時間(60日)に設定されています。
結論から言うと、パソコンの前にいるユーザーが入れ替わったかどうかを把握できない限り、それを防ぐ簡単な方法はありません。セッションの有効期限を短く設定するか、アプリから定期的にログアウトを呼び出すこともできますが、その場合、ユーザーが長時間パソコンを使用していると、認証フローを再度通過する必要が出てきてしまいます。
Discourseは現在利用しているログインおよびセッションフローを拡張できますが、上記の詳細が不明なため、問題の所在や改善の機会を特定するのは難しい状況です。
pnoeric
(Eric)
7
返信ありがとうございます!この問題は結局、メインサイトでのユーザー管理に尽きることに気づきました。
ユーザーがメインサイトから手動でログアウトした場合、Discourse(API経由)を呼び出して、そちらでもログアウトさせる必要があります。
また、ユーザーがログアウトしなくてもセッションが切れた場合、同時にDiscourse側でもログアウトさせるために呼び出す必要があります。
最後に:ユーザーがDiscourseで「ログアウト」をクリックしてログアウトした場合、そのイベントを(Webhook経由で)捕捉し、こちらのサイトでもログアウトさせる必要があります。
さあ、統合だ!