Как выглядит рабочий процесс при использовании Auth0 (jwt)?
Здравствуйте.
Помогите разобраться.
1) Полученные от сервера данные (access token, id token) нельзя сохранять в local storage, туда помещается только флаг залогинен/нет или время жизни токена. Как с этим работать? После логина вся информация хранится в памяти (store), перезагружаю страницу - все теряется, пользователь не залогинен, нужно опять. Как сделать так, чтобы после перезагрузки страницы пользователь оставался на той же странице и залогинен?
2) В Firebase, например, есть метод onAuthStateChange, который можно поместить на главной странице и проверять при каждом действии. Что есть в auth0, как вообще следить за состоянием аутентификации на сервере, как спросить сервер, залогинен ли все еще пользователь?
3) На данный момент от Auth0 мне нужна только возможность логина и назначения ролей и разрешений пользователям. При логине мне должны выдаваться роли и разрешения, которые я сохраню в store и буду проверять наличие ролей при запуске какого-либо необходимого компонента. Фактически, мне нужно забрать эти данные от сервера и следить за состоянием некой сессии н сервере, как это сделать? Ведь когда пользователь проходит аутентификацию, на сервере где-то (бд, ...) происходит отметка того, что пользователь с таким-то ID выполнил вход и эта аутентификация работает столько-то секунд или бессрочная. И каждый раз при запуске приложения я должен делать запрос на сервер, чтобы спросить его о том, а залогинен ли все еще данный пользователь и получить от сервера все те данные, которые были у меня в state, но удалились из-за перезагрузки страницы. Как это сделать?
1. Почему вы решили, что токен нельзя хранить в localStorage? Храните его либо там, либо в cookie и проверяйте наличие при инициализации вашего приложения.
2. Если пользователь присылает невалидный токен или делает запрос по защищенному пути без токена, возвращайте с сервера код 401 и обрабатывайте ошибку на клиенте.
Идеальным вариантом будет использовать один обработчик для всех запросов.
На примере axios:
3. Достаточно при инициализации при наличии токена, например сделать запрос за данными о пользователе. И в зависимости от ответа отрисовывать нужную версию приложения.
3. Достаточно при инициализации при наличии токена, например сделать запрос за данными о пользователе. И в зависимости от ответа отрисовывать нужную версию приложения.
Допустим, что в самый первый раз я запросил информацию о пользователе (а значит сессия на сервере активна и пользователь прошел аутентификацию и может получить доступ к закрытым маршрутам):
1) Сохранил его в redux store. В таком случае после перезагрузки страницы данные из оперативной памяти сотрутся и придется снова выполнять вход. Как обрабатывать такое поведение?
2) Сохранил данные в local storage, поставил флаг isUserLoggedIn. В таком случае получается, что можно просто добавить эти данные себе в local storage и, не вводя данные в форму аутентификации, получить доступ к закрытым маршрутам приложения. Необходимо как-то проверить сессию на сервере и снова запросить данные пользователя. С какой периодичностью это делать, как?
havemanyquestions, не заметил, что в вопросе Auth0, никогда им не пользовался, поэтому по flow не подскажу.
По поводу безопасности, в интернете описано множество методик, как относительно безопасно работать с токенами и защищаться от xss и csrf.
1. Для этого и хранят токен, чтобы без логина получить пользовательские данные и обращаться по защищенным маршрутам. Вспомните когда последний раз осуществляли вход в том же VK.
2. isUserLoggedIn бесполезнейший флаг который вам не даст ничего.
Насчет времени жизни токена почитайте про refresh token, ну или просто делайте logout.