Реализация авторизации на сайте, применяя сессию

Как лучше реализовать авторизацию на сайте, использую id сессии...

На сайте возможно авторизоваться на нескольких устройствах и при необходимости выйти со всех устройств.

Как это выполнено в данный момент:

  • Авторизовываясь, генерирую уникальный ключ, затем в отдельно поле у пользователя в бд. Заношу его, так при каждой авторизации. Сохраняю только последние 3 ключа. Если пользователю необходимо разлогиниться, просто удаляем необходимой ключ из поля и обновляем.

  • Имея в куках сгенерированный ключ, выполняем поиск в таблице применяя

    session LIKE '%,{$hashi},%'"

Сделано ненадежно, но маловероятно, что ключ при авторизации будет выдан дважды. Для этого к каждому ключу в начале, добавляю id пользователя.

Ненадежно, почему? При желании если разобраться, то вполне возможно понять, что в начале каждого ключа присутствует id пользователя. Остается просто рандомно, миллион и миллион раз генерировать ключи чтобы попасть в необходимый аккаунт. А если каким то образом просмотреть логику формировния ключа, то чтобы взломать чей то аккаунт не составит труда.

Возвращаясь к вопросу о применении id сессии в качестве ключа.

Не совсем понятно как и каким образом лучше поступить. Было бы плевым делом, если при авторизации заносить в переменную сессии id пользователя, а затем брать id и данные из бд. Все отлично, на вид, это гораздо надежнее будет чем принцип описанный выше. И поиск в бд по числу, а не по строчке, что скорость работы значительно выше.

Но остается вопрос, как в таком случаи реализовать выход из аккаунта на всех устройствах?

Или остается только выносить все id сессий и id пользователей которым присваивается сессия? В таком случаи при выборке придется делать запрос через left в 2 таблицы. И обновлять тайм сессии, скажем каждые 5 часов, всего сессия храниться неделю. Чтобы не вылетала авторизация если пользователь был активен скажем 2 суток назад. Так же обновлять тайм в таблице сессиий и выставлять крон для удаления строк, тайм обновления которых более недели назад.

Первый вариант выглядит лучше и надежней, со вторым много головной боли.

Возможно как то лучше, возможно есть еще вариант для реализации данного функционала?

Или если пользователь выходит со всех устройств, брать все сессии их скажем миллион. Открывать, читать и если в сессии id пользователя соответствует, удаляем. Конечно просто, но какая будет нагрузка и как долго этот процесс займет.


Ответы (0 шт):