@bagrovykt

WebPush: FCM-токен и несколько пользователей, best-practice?

Пишу pwa на js, впервые пробую webpush, все работает как часики в случае один юзер на множестве устройств, но в случае множества юзеров на одном устройстве есть некое непонимание алгоритма действий.

Может быть есть что-то вроде best-practice по менеджменту fcm-токенов для мультиюзерного pwa, в случае авторизации разных пользователей на одном и том же устройстве. Как правильно хранить и вообще нужно ли хранить этот токен, т.к. браузер один на всех а пользователи разные.

Сейчас работает так:
По успешному getToken(), полученный fcm-token фиксируется в localStorage, затем отправляю его на ендпоинт бэка и там он условно пишется в табличку с девайсами, сопоставленными с user-id. При дизавторизации fcm-токен удаляется из localstorage не дергая deleteToken(), затем авторизуется другой юзер, триггерит getToken() и в ответ получает токен предыдущего юзера, метод пытается отдать его на бэк а там столбец token unique=True, получает 400 = система становится неконсистентна.

Что-то мне подсказывает, что при дизавторизации нужно делать deleteToken(), но тогда при следующей авторизации нужно сразу вызывать getToken(), и если в промежуток между logout/login будет отключены уведомления, браузер скажет "айайай надо ждать явного действия пользователя" - ведь сначала мы ожидаем getNotificationPermission().

Чувствую что решение простое, но пока не придумал, направьте в какую сторону копать
  • Вопрос задан
  • 32 просмотра
Решения вопроса 1
@bagrovykt Автор вопроса
В вопросе и ответе getNotificationPermission - обертка для "Notification" in window и Notification.requestPermission
Набросал решение, оно банально, и описано частично в вопросе, но все же вот, наверняка кому-то пригодится:

Добавляем в профиль признак подписки true/false
Перед фактическим logout делаем deleteToken(), localStorage.removeItem fcm-токена и удаляем соответствующую запись из таблички с девайсами - оборачиваем это в промис, чтобы успеть завершить все действия до фактического выхода.
При логине если стейт признака подписки true - проверяем getNotificationPermission() и если все ок, то делаем getToken(), в ином случае даем toast уведомление.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы