Вернулся к своему же посту про refresh после F5 🤔
Когда писал (https://set.ki/post/TrLgpCk) про флажок в localStorage и восстановление входа после перезагрузки, казалось, что схема уже получилась удачной. Access-токен хранил в памяти приложения, то есть в состоянии фреймворка. Refresh лежал в httpOnly cookie без доступа из JS, а флажок нужен был только затем, чтобы не дёргать анонимов лишним запросом. Странность «стёр флажок, cookie жива, сайт выглядит как после выхода» тогда принял как осознанный компромисс.
Потом полез в реальный код. И оказалось, что красивое описание расходится с фактическим поведением сразу в нескольких местах.
Во-первых, флажок после F5 читался не всегда. Получалось, что идея «не делать лишний refresh гостям» жила сильнее в голове, чем в инициализации приложения. Исправил. Если флажка нет, не пытаюсь восстанавливать сессию. Если есть, отправляю refresh. При этом сам флажок по-прежнему не считаю доказательством того, что пользователь авторизован.
Иначе localStorage снова начинает выглядеть как источник истины о сессии, а это опасная иллюзия❗️
Во-вторых, обнаружил, что refresh на прокси теоретически мог приехать не только из cookie, но и из JSON. Если где-то посредник однажды предпочтёт тело запроса вместо cookie, то httpOnly уже перестаёт быть единственным источником правды. Исправил и это. Для обновления сессии и выхода теперь используется только cookie. Токен в теле запроса просто игнорируется.
И третья история всплыла, когда открыл два приложения на одном локальном хосте. В голове были два BFF и две независимые сессии, а в браузере обе использовали cookie с одинаковым именем. В итоге последний вошедший пользователь просто перетирал refresh другого. Развёл имена cookie. Отдельно для web, отдельно для админки. После этого история «залогинился в админке, кандидату тоже снесло сессию» наконец перестала быть нормой разработки.
🌱 К чему в итоге пришёл. Hint полезен, только если его действительно читают. Cookie полезна, только если именно она остаётся главным источником refresh. Два UI на одном хосте сами по себе не дают изоляции, пока используется одно имя cookie. И ещё один вывод. Документация должна совпадать с кодом. Иначе очень легко убедить себя, что «всё уже изолировано», пока DevTools показывает обратное.
Странность с удалённым флажком и живой cookie всё-таки оставил. Для такого мягкого фильтра это честный компромисс. Если после очистки localStorage нужен другой пользовательский опыт, то это уже продуктовое решение, а не проблема самой схемы.
Интересно, у кого ещё документация красивее кода в auth. Или это только у меня так бывает❓
· 15.07
У меня есть кейс, что дока появлялась уже по самому коду, так что ноль не соответствий. Но минусы конечно тоже есть.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён