Сохранение аутентификации пользователя Gun DB во время сеанса
Я тянусь за системой аутентификации Gun/SEA для распределенного / безсерверного приложения. Это приложение сохраняет информацию о сеансе в локальном хранилище, когда пользователь Gun аутентифицирован. Одна из проблем, с которыми я сталкиваюсь, - это когда страница обновляется или открывается новая вкладка. Я хочу сохранить аутентификацию пользователя, пока сеанс действителен, и я бы не хотел хранить имя пользователя и пароль в локальном хранилище из-за XSS и физических соображений безопасности., Есть ли решение этой проблемы в настоящее время? Я думаю, что sessionStorage может быть лучше, но у него все еще есть некоторые проблемы безопасности, связанные с хранением имени пользователя и пароля там, где его может получить злоумышленник, и с необходимостью входа пользователя в систему при открытии новой вкладки.
1 ответ
Грант ! Замечательно слышать от вас, извините за задержку с ответом (я не уверен, кто был комментирующим, поскольку это не помогло вашей ситуации).
Это отличный вопрос, и вы уже немного коснулись границ безопасности и технологий браузеров - честно говоря, ни один из них не очень хорош. Давайте рассмотрим:
- если вы добавите
user.recall({sessionStorage: true})
он попытается автоматически войти в систему. Но вы правы, есть некоторые компромиссы безопасности, но я думаю, что это разумно. localStorage
, Я слышал, как несколько человек жалуются, что разные браузеры плохо обрабатывают sessionStorage (не сохраняет в новой вкладке и т. Д.), Поэтому следующим вариантом будет использование localStorage. Тем не менее, я думаю, что это актуальная проблема безопасности.- СПА. Одностраничное приложение - это уже будет полезно, если вы пытаетесь распространять автономные упакованные "приложения". Но вы правы, у вас все еще есть проблема обновления. По моему опыту, (1) работал достаточно хорошо, чтобы сделать это хорошим опытом для пользователей.
- ШТЫРЬ. Еще одна идея, которую разработало наше сообщество, заключалась в использовании (1 ~ 3), но в сочетании с PIN-кодом устройства. Это означает, что вы можете хранить его в localStorage с разумными допущениями в отношении безопасности, а при обновлении / возобновлении пользователи вводят свой ПИН-код для расшифровки своего сеанса.
IndexedDB
, Оказывается, что API-интерфейс WebCrypto имеет возможность импортировать ключи и будет шифровать их в IndexedDB и извлекать их позже, не передавая их на пользовательскую землю - по крайней мере, так я слышал. Однако вам все еще приходится иметь дело с первоначальным получением ключей, и поддержка IndexedDB варьируется, и вы должны написать для нее плагин GUN.- Расширение браузера. Мне это нравится меньше всего, так как для этого требуется, чтобы пользователь что-то установил, но из-за того, что браузеры не предоставляют какой-то встроенной функциональности, эквивалентной защищенной, мы должны вмешаться. Хорошей новостью является то, что происходит интеграция с GUN + MetaMask, и MetaMask уже имеет 1M+ установок, так что, возможно, у ваших пользователей уже есть такая возможность.
- API браузера. Мы будем работать с командой MetaMask и другими, чтобы получить стандартный API для этого в качестве стандарта. Я надеюсь, что Brave последует примеру MetaMask, а FireFox последует за Brave, а Chrome последним.
Между тем, ваше оригинальное предложение, вероятно, лучше всего - использовать (1) sessionStorage. Это будет / является прямой / обратной совместимостью с MetaMask. В среднесрочной перспективе, надеюсь, вы или кто-то еще в сообществе получите (5) работу. И тогда долгосрочное (6 и 7) будет решением.
На данный момент, ознакомьтесь с демонстрацией MetaMask: https://twitter.com/marknadal/status/1062153254283276288