Пользователь А входит на мой сайт, а затем нажимает «Форумы». Он перенаправляется в Discourse, который обращается к моему сайту через SSO, и пользователь аутентифицируется и автоматически входит в Discourse. Отлично, всё работает идеально.
Через некоторое время пользователь А уходит от компьютера, и его сессия истекает автоматически. Он никогда специально не нажимает «Выйти» ни в моём приложении, ни в Discourse.
Пользователь Б входит на мой сайт на том же устройстве, нажимает перейти на форумы, и поскольку в Discourse пользователь А всё ещё считается вошедшим, запрос SSO не выполняется, так как сессия в Discourse активна. Теперь пользователь Б вошёл в Discourse как пользователь А. :-\
Верно, но как это сделать, если пользователь «отошёл» от компьютера и его сессия истекла? Возможно, это скорее вопрос по PHP (на чём написан мой основной сайт)…
Не могли бы вы уточнить, что вы имеете в виду? Какова продолжительность сеанса в вашем приложении? Как вы обрабатываете истечение сеанса там?
В Discourse есть настройка maximum session age (максимальный возраст сеанса), которая по умолчанию установлена на 1440 часов, то есть 60 дней.
Если коротко: если вы не знаете, что за компьютером сменился пользователь, вы не сможете легко предотвратить это. Вы можете уменьшить продолжительность сеанса или периодически вызывать из своего приложения функцию выхода пользователей, но тогда, если ваши пользователи находятся за компьютером в течение более длительных периодов времени, им придётся снова проходить процесс аутентификации.
Discourse может расширить используемый вами текущий процесс входа и управления сеансами, но без дополнительной информации по вышеуказанным вопросам трудно точно определить, где именно кроется проблема и какие возможности существуют.
Спасибо за ваш ответ! Я понял, что эта проблема в конечном итоге сводится к управлению пользователями на главном сайте.
Если пользователь вручную выходит из системы на главном сайте, мне нужно вызвать Discourse (через API), чтобы также выйти из системы там.
А если пользователь не выходит, но его сеанс истекает, мне нужно вызвать Discourse, чтобы выйти из системы там в то же время.
И наконец: когда пользователь выходит из Discourse, используя «Выйти» там, мне нужно перехватить это событие (через веб-хук) и выйти из системы на моем сайте тоже.