Показывать или не показывать страницы от тупо наличия токена в sessionStorage - это плохая идея.
Токен обязательно должен валидироваться сервером, и уже от результата проверки плясать на UI.
Я бы возвращал 401 ошибку при кривом/удалённом/отсутствующем токене.
Можно еще писать не один токен, а несколько (чтобы можно было с разных браузеров/девайсов авторизовываться).
При загрузке приложения я бы посоветовал посылать запрос на получение текущего юзера по токену. Если вернется 401, значит пользователь не авторизован. Если при этом токен остался на клиенте (например, localStorage), то его надо удалить.
В целом, стандартный подход.
Авторизацию я бы еще посылал не через MYPRIVATEHEADER, а как "Authorization: Bearer 2398mv59023m5v32".
Использую гугловский. Функционала более чем хватает для всех 2FА, которые использую (порядка 5-7 штук).
Интерфейс простой, интуитивный. Не вижу смысла искать другой "аутентификатор".
Предположим, что авторизация создают новую сессиию.
Варианта два:
- убивать все сессии по данному пользователю при авторизации (по мне так, предпочительнее)
- при авторизации проверять наличие текущей сессии - вывести сообщение, если она активна
// UPD
Дополнение к комментарию от Сергей :
Я захожу под персонажем1 с клиента1.
Затем захожу под персонажем2 с клиента2.
При авторизации персонажа2 - клиент1 вылетает с ошибкой.