Самая большая проблема с отслеживанием присутствия пользователя (onine / offline) по HTTP - как определить, когда пользователь перешел в автономный режим.
Легко определить, когда пользователь подключился к сети - само присутствие аутентифицированного запроса предполагает, что пользователь активен. Однако, поскольку HTTP не имеет состояния, отсутствие последующего запроса может означать либо то, что пользователь ушел в автономный режим, либо что пользователь находится в сети, но в последнее время он ничего не делал с вашим приложением.
Таким образом, наилучшее предположение, которое вы можете сделать, - это установить тайм-аут и, если пользователь не сделал запрос в течение этого времени, переключиться в автономное состояние.
Самой простой реализацией было бы использование lastTimeActive, как предложил Джонатан Сэмпсон. Однако это не даст вам длительности сеанса пользователя, а лишь приблизителен к тому, кто сейчас находится в сети.
Более сложный подход - использовать lastTimeActive и lastTimeLoggedIn. LastTimeLoggedIn устанавливается во время первого запроса на аутентификацию, который составляет более 5 минут от предыдущего запроса на аутентификацию. Пользователь считается онлайн, если за последние пять минут был запрос с проверкой подлинности. Продолжительность сеанса для пользователя - это разница во времени между lastTimeActive и lastTimeLoggedIn.
Если в вашем приложении также есть возможность выхода из системы для пользователя, вы также можете считать, что это действие отключено. Однако, если ваше приложение не является банковским, скорее всего, пользователи просто закроют свой браузер.
Кроме того, избегайте любых фоновых тем для обновления автономного / онлайн-статуса ваших пользователей. Вы должны использовать приведенную выше логику только в том случае, если есть явный запрос о статусе конкретного пользователя, и вы должны обновлять только тех пользователей, о которых вас просили.