Как правильно хранить куки для использования пользователем нескольких аккаунтов сразу?
Хочется понять, как вообще делать надежную авторизацию, именно сам способ, т. е. как хранить куки, как что делать, с реализацией проблем нет, еще очень интересно как реализовать multiaccount на сайте.
Как раз сейчас это пилю.
У меня алгоритм такой (после почитываний и измышлений):
- Каждый запрос на сервере проверяется на наличие куки с токеном_Сессии (здесь речь про Сессию_аккаунта - т. е. авторизованного юзера). Можно в куки передавать и логин_юзера (чтобы легче было искать, и для верности).
- Если нет куки - значит это неавторизованный гость, понятно.
- Если токен_Сессии есть, то ищем его в БД в специальной таблице_Сессий. Там должен быть такой токен (ещё и с таким логином, если в куки есть логин).
- Если приходят данные регистрации (из формы), то добавляем в таблицу_аккаунтов новый аккаунт. Пароль сохраняем хешированный, с солью; соль сохраняем тут же в соседнем поле таблицы. Для шифрования ещё применяем ключ, который храним в конфиге, и который нередко меняем.
- Если приходят данные авторизации (из формы), то ищем в таблице_аккаунтов пришедший логин; из этой записи берём соль и (с ключом) хэшируем пришедший пароль. Появившийся хэш должен совпасть с хэшем_пароля в этой записи - значит авторизуем.
При авторизации (открытии Сессии) создаём токен_Сессии, например - это хэш логина (с солью или без). И записываем новую Сессию в новую запись таблицы_Сессий: пишем туда логин и токен_Сессии. И отправляем в браузер ответ с куки, в котором записали токен_Сессии. (Далее... - по началу описания: каждый запрос проверяем на наличие такого куки.)
- Ваш "мультиаккаунт" - это параллельные Сессии, очевидно. Их можно запретить (тогда они исключены); можно разрешить.
- Если параллельные Сессии запрещены - то при проверке таблицы_Сессий там должно быть не больше одной записи с данным_логином.
- Если параллельные Сессии разрешены - то в Таблице_Сессий может быть больше одной записи-Сессии с данным_логином.
При параллельных Сессиях: когда юзер выходит из аккаунта - спрашиваем, хочет ли он выйти на всех устройствах (технически речь идёт только о текущем браузере), или только на этом?
- Если выходит "только на одном устройстве", то удаляем из таблицы_Сессий только одну эту Сессию-запись.
- Если выходит "на всех устройствах" - удаляем все записи с данным_логином.
Можно ещё сочинять сложный изыск с авторизацией всего один раз (при разрешённых параллельных Сессиях), а на других "его"_устройствах автоматом входить в аккаунт... Но это не гуд - ИМХО.