Всем привет, первый раз пишу фулстек приложение, не могу разобраться с авторизацией. Да, я понимаю, что примерно миллион статей в интернете есть на эту тему, но все равно не могу понять некоторые вещи.
Есть форма, я отправляю с помощью неё данные на сервер, где записываю пользователя в базу данных (вот тут вопрос, нормально ли отправлять данные клиент-сервер в открытом виде аля {email:'ivan@gmail.com', password: '1234567'}
Все, пользователь записан в базу данных, теперь я должен вернуть на клиент некую куки, которая должна в дальнейшем идентифицировать пользователя. Но т.к пользователь может быть залогинен с разных устройств, то я сделаю отдельно таблицу, где будут храниться его куки для разных устройств. Возвращаю куку, которая привязана к устройству - десктоп. Тут встает вопрос. Как мне создать уникальную куку ? с помощью uuid + тип устройства?
Пришла кука на клиент, но т.к куки должны быть http only я не могу получить доступ к куки с помощью document.cookie, как мне тогда её получить и записать на клиенте в куки?
И тут еще один вопрос возникает. Допустим я сохранил уникальную куку для десктопа пользователя. Но он в публичном месте (библиотека допустим) поставил флаг "запомнить меня". Пришел домой, сменил пароль. Значит я должен перезаписать куку по полю - десктоп для конкретного пользователя, верно?
1. Отправлять - нормально. на сервере ты не хранишь пароль в открытом виде, а хранишь хэш. Если устройство скомпрометировано, ты никак не сможешь защититься.
2. В куке ты передаешь данные. там может храниться до 4кб разного хлама, зачем тебе это хранить на сервере? Главное что ты туда должен положить - аксесс токен, которым будет подписываться каждый запрос на авторизованные эндпойнты. Кука - просто один из механизмов для хранения и передачи этого токена с клиента на сервер. Можно точно так же отдать явным респонсом вместо куки, просто это потенциальная дыра безопасности на клиенте.
3. Токены хранишь на сервере, у них должно быть время жизни. Классика - пара часов, плюс к нему рефреш токен, которым можно перевыпустить новый. UPD Про уникальные токены - почитай например про JWT токен
4. на клиенте ты в браузере не должен ничего читать. Запрос на бэк для клиента будет типа "не подписанным", просто вместе с запросом на бэк полетит и инфа из куки, которую уже ты должен собрать и определить статус клиента.
5. Выше понятно, но тем не менее - при смене пароля просто убиваешь все ранее выпущенные токены авторизации вместе с рефреш токенами. В дальнейшем любой эндпойнт, требующий авторизации, будет возвращать какую-то ошибку, на которую фронт должен переводить пользователя в окно авторизации. Особой магии тут нет.
Как мне эту куку при повторных запросах с клиента прикреплять на сервер? Она же должна где-то сохраниться?
Нажал на форму => запрос к серверу=> запрос к бд => ты зарегистрирован => возвращаю статус 200 и куку на клиент => пользователь перезагружает страницу и как тут сделать, что бы его не разлогинило?
Я понимаю,что на этом моменте мне надо присланную и записанную ранее куку прочитать и сделать запрос к серверу, если она есть в бд, то отдать по куки данные и права, которые принадлежат обладателю куки
Кука хранится в хранилище браузера, параметры хранения выставляешь на сервере, когда отправляешь ее клиенту. В дальнейшем она будет монтироваться браузером в каждый запрос к серверу, ты на сервере данные оттуда вытаскиваешь.
В httpOnly доступ из js не получишь, туда кладешь свой драгоценный токен авторизации, остальные поля не нужны (типа name, surname), их можно просто в респонс эндпойнта в JSON формате отдавать, фронт будет это читать и использовать.
JS при httpOnly куке про этот токен и про то, что бэку он нужен, вообще не знает. И это правильно. А бэк читает значения из заголовка и проверяет наличие данных из куки.