@Mark321

Как работает авторизация?

Всем привет, первый раз пишу фулстек приложение, не могу разобраться с авторизацией. Да, я понимаю, что примерно миллион статей в интернете есть на эту тему, но все равно не могу понять некоторые вещи.
Есть форма, я отправляю с помощью неё данные на сервер, где записываю пользователя в базу данных (вот тут вопрос, нормально ли отправлять данные клиент-сервер в открытом виде аля {email:'ivan@gmail.com', password: '1234567'}

Все, пользователь записан в базу данных, теперь я должен вернуть на клиент некую куки, которая должна в дальнейшем идентифицировать пользователя. Но т.к пользователь может быть залогинен с разных устройств, то я сделаю отдельно таблицу, где будут храниться его куки для разных устройств. Возвращаю куку, которая привязана к устройству - десктоп. Тут встает вопрос. Как мне создать уникальную куку ? с помощью uuid + тип устройства?

Пришла кука на клиент, но т.к куки должны быть http only я не могу получить доступ к куки с помощью document.cookie, как мне тогда её получить и записать на клиенте в куки?

И тут еще один вопрос возникает. Допустим я сохранил уникальную куку для десктопа пользователя. Но он в публичном месте (библиотека допустим) поставил флаг "запомнить меня". Пришел домой, сменил пароль. Значит я должен перезаписать куку по полю - десктоп для конкретного пользователя, верно?
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
@strelok011
Поделюсь своим опытом:

1. Отправлять - нормально. на сервере ты не хранишь пароль в открытом виде, а хранишь хэш. Если устройство скомпрометировано, ты никак не сможешь защититься.
2. В куке ты передаешь данные. там может храниться до 4кб разного хлама, зачем тебе это хранить на сервере? Главное что ты туда должен положить - аксесс токен, которым будет подписываться каждый запрос на авторизованные эндпойнты. Кука - просто один из механизмов для хранения и передачи этого токена с клиента на сервер. Можно точно так же отдать явным респонсом вместо куки, просто это потенциальная дыра безопасности на клиенте.
3. Токены хранишь на сервере, у них должно быть время жизни. Классика - пара часов, плюс к нему рефреш токен, которым можно перевыпустить новый. UPD Про уникальные токены - почитай например про JWT токен
4. на клиенте ты в браузере не должен ничего читать. Запрос на бэк для клиента будет типа "не подписанным", просто вместе с запросом на бэк полетит и инфа из куки, которую уже ты должен собрать и определить статус клиента.
5. Выше понятно, но тем не менее - при смене пароля просто убиваешь все ранее выпущенные токены авторизации вместе с рефреш токенами. В дальнейшем любой эндпойнт, требующий авторизации, будет возвращать какую-то ошибку, на которую фронт должен переводить пользователя в окно авторизации. Особой магии тут нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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