#angularjs #jwt #local-storage
#angularjs #jwt #локальное хранилище
Вопрос:
Я пытаюсь разработать наилучшую практику реализации аутентификации пользователя через JWTs с моего внутреннего сервера, и хотя у меня это работает, я просто хотел кое-что уточнить, поскольку в Интернете есть много неоднозначных отзывов.
После входа моего пользователя JWT отправляется обратно в мое приложение Angular, а затем этот токен отправляется обратно на мой сервер для получения сведений о профиле пользователя. После успешного выполнения этот JWT сохраняется в localStorage
, создается сеанс, и пользователь перенаправляется на панель мониторинга, где они могут свободно перемещаться по сайту.
Однако, когда страница обновляется, я беру JWT из localStorage
и передаю его обратно на сервер, чтобы снова получить данные профиля пользователя (поскольку я не храню никаких пользовательских данных в хранилище). Хотя это работает, возникает значительная задержка, пока приложение ожидает возврата пользовательских данных и повторно создает сеанс. Это приводит к тому, что мое приложение временно отображает экран входа в систему (поскольку нет аутентифицированного пользователя) и вызывает очень уродливый пользовательский интерфейс.
Мой вопрос в том, какова наилучшая практика в этом сценарии? Правильно ли я поступаю? Должен ли я хранить какие-либо пользовательские данные в хранилище?
Я знаю, что, вероятно, есть похожие вопросы, однако я не могу найти ничего, что напрямую связано с повторным входом пользователя с помощью JWT при работе с состоянием входа.
Комментарии:
1. Я использую APP_INITIALIZER angular.io/api/core/APP_INITIALIZER чтобы проверить, сохранен ли токен, действителен ли он, и получить профиль пользователя перед запуском приложения. Для вашего экрана входа в систему просто перенаправьте пользователя, если он был авторизован. поскольку инициализатор выполняется до отображения страницы входа и страница входа перенаправляется напрямую, пользователь с действительным токеном никогда не увидит логин
2. Спасибо @x4rf41, но применимо ли это к AngularJS? Похоже, что APP_INITIALIZER присутствует только с версии 4 и выше, или я ошибаюсь в этом?
3. Вы правы. Существуют другие решения, подобные этому: tech.europace.de/angularjs-ordered-init-async-promise но, имо, они усложняют ситуацию. почему бы просто не разрешить отображение экрана загрузки (с отключенными входными данными и загрузочным счетчиком) во время выполнения вызова api. Таким образом, пользователю также очевидно, что он автоматически входит в систему. Другим простым решением было бы показать наложение с загрузчиком, который скрывает экран входа в систему во время выполнения вызова api
4. О «наилучшей практике»: я думаю, что в данном случае ее действительно нет, поскольку angularjs не предоставляет для нее встроенную функцию. все другие способы можно считать обходными. просто выберите то, что лучше всего подходит вашему приложению (имеет наибольший смысл для пользователя). Вы найдете множество различных подходов при поиске на этом сайте или в Интернете
5. Спасибо за руководство @x4rf41 Я собираюсь рассмотреть ваши идеи и найти способ обойти это.