@kirill-93

Правильно ли сделана авторизация?

Чтобы не использовать ничего готового, для, так сказать, развития, решил сам сделать авторизацию. Сайт на vuejs (SPA).
1. Пользователь вводит логин/пароль в форму, отправляет на сервер
2. На сервере проверяю правильность данных и генерирую случайный хэш, который записываю в базу и высылаю обратно пользователю.
3. На стороне пользователя принимаю хэш, добавляю его в заголовок всех аякс запросов, например MYPRIVATEHEADER, на стороне сервера, по адресам, требующим авторизации проверяю этот заголовок, беру его содержимое и ищу в базе пользователя с таким хэшэм.

На этом все. Скажите, правильно ли я все сделал?

И следующий вопрос: Как правильно организовать разлогинивание пользователем. Например, я хочу в принудительном порядке разлогинить пользователя. Для этого я в базе удалю его хэш. Но пользователь в текущей ситуации ничего не поймет, потому что проверка на корректность происходит только при авторизации, а при обращении к другим роутам просто вернется ошибка 403, если такого хэша нет. Как правильно сделать? Завести мидлвер, который проверяет хэш и возвращать какую-то ошибку, а на клиенте проверять ответ на абсолютно все запросы, и, получая такую ошибку, разлогинивать пользователя?
Помогите разобраться, Спасибо.
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 3
angrySCV
@angrySCV
machine learning, programming, startuping
современный подход, отдавать авторизационные данные пользователя зашифрованными в виде токена, ключ для расшифровки хранится в памяти, и ничего не ищется в БД и ни с чем не сравнивается, при запросе расшифровываются данные токена, и решается давать доступ или нет на основе его токена (в токене записанно какие у пользователя есть разрешения), что позволяет убрать нагрузку с БД и неограниченно масштабировать функциональность по серверам, тк каждый сервер имеет для расшифровки один и тотже ключ, в случае же проверки данных в единой БД, масштабирование упрется в производительность этой БД.
Ответ написан
sitnikovik
@sitnikovik
Веб-разработчик
С хэшом все правильно. Можно еще класть в куки этот хэш, чтобы при закрытии сессии авторизация сохранялась. И последовательно проверять при открытии сайта, сначала переменную сессию потом куку. Если в куке нет хэша то юзер точно вылетел))

А при принудительной деавторизации можно сделать так. Ты в индекс файле проверяешь авторизован ли юзер или нет. При каждой заходе на сайт ты сравниваешь хэш в браузере с хэшом базы. Если разные то - просишь авторизоваться снова.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Я бы возвращал 401 ошибку при кривом/удалённом/отсутствующем токене.

Можно еще писать не один токен, а несколько (чтобы можно было с разных браузеров/девайсов авторизовываться).

При загрузке приложения я бы посоветовал посылать запрос на получение текущего юзера по токену. Если вернется 401, значит пользователь не авторизован. Если при этом токен остался на клиенте (например, localStorage), то его надо удалить.

В целом, стандартный подход.
Авторизацию я бы еще посылал не через MYPRIVATEHEADER, а как "Authorization: Bearer 2398mv59023m5v32".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы