реализация правильной опции “запомнить меня” и завершение сеансов удаленно? — хабр q&a

"запомнить меня"

У куки есть срок жизни, если он не указан – кука сессионная, если указан – кука “постоянная” в современном мире сессионные куки смысла не имеют (особенно в браузерах семейства chromium) т.к. при установке параметра “запоминать открытые вкладки” браузер не только восстанавливает открытые вкладки, но и восстанавливает “сессионные” куки (и даже SessionStorage).

Как вариант, можно передавать токен авторизации через ajax и хранить его в объекте js, тогда куку устанавливать не нужно. Но опять же, если вы запишите токен в поле формы, как рекомендует викепедия или даже запишите ее в DOM с помошью js, то браузер может восстановить содержимое страницы.

Ещё вариант – может быть одним из правильных – комбинировать js вариант и куки с малым сроком жизни (но не слишком малым, скажем минут 10), в этом способе вы просто на открытой вкладке через setTimeout раз в минуту обновляете срок действия куки.

ps: варианты даны для обеспечения отключенной опции “запомнить меня”, со включенной – просто выставляйте куку на большой срок жизни (обычно это от месяца до года) И обновляйте ее при каждом удобном случае.

в случае полностью безкуковой авторизации (например как предлагает @TheDoctor) есть одна большая, но решаемая проблема – не будет работать “открыть в новой вкладке” решение на вскидку – передать сигнал другим вкладкам при появлении новой используя LocalStorage, а при обновлении токена используя его же, передать этот токен всем открытым вкладкам.

Как реализовать функцию "запомнить меня" с jwt?

В моём приложении уже есть авторизация по JWT. Теперь хочу сделать функцию “Запомнить меня”. Суть такая: если пользовать поставил галочку, то в следующий раз вход будет произведён автоматически. А если он галочку не поставил, то после закрытия вкладок с сайтом ему надо будет опять логин и пароль вводить.

Похожее:  Как реализовать "защиту" авторизации по номеру телефона? — Хабр Q&A

Соображение такое: можно при установленной галочке токен записывать в localStorage. Сложнее с тем, как токен удалять, если галочки нет. Если галочки нет, можно токен кидать в sessionStorage, но это не очень удобно будет – во-первых, если пользователь вторую вкладку откроет, то там ему опять авторизоваться придётся, и ещё придётся подтягивать токена сразу с этих двух хранилищ.

Как мне тогда лучше всего реализовать “Запомнить меня”?

Правильный способ использования функциональности “запомнить меня” в php

установить временную задержку между попытками входа в систему (для предотвращения атак bruteforce) и ограничить количество попыток

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

для регенерации идентификатора сеанса почти на каждой операции

ЭМ, нет. Это, скорее всего, уничтожит объект. Вы всегда должны генерировать новый id, когда текущий id истек или когда пользователь аутентифицируется-в противном случае оставьте его один.

но я действительно запутался в своей основной проблеме: какой путь правильный, для функции “Запомнить меня”? использовать cookies / session / database?

поскольку вам нужно сохранить токен на клиенте, это означает cookies (если вы не хотите написать что-то действительно сложное с использованием локального хранилища). Поскольку вы не хотите выставлять данные через cookie / сделать подделку простой, это означает, что это должно быть случайное значение. И для согласования сохраненного случайного значения, это означает хранение данных на стороне сервера-вероятно, в базе данных, поскольку должна быть возможность ссылаться на данные на основе идентификатора пользователя или на основе случайного значения.

в то время как вы можете просто использовать не истекающий (или очень долгоживущий) сеанс, я бы держался подальше от этого-данные будут снежным комком – и это хорошая идея, чтобы обновить данные сеанса время от времени.

Вам также нужно угодить для сценария где потребитель хочет вас вспомнить ее на 2 различных компьютерах. Если вы только держите один токен “Запомнить меня” для каждой учетной записи, тогда вам придется использовать одно и то же значение на обоих клиентах или удалить старый токен при создании нового (т. е. пользователя можно запомнить только на одной машине).

пожалуйста, объясните свою идею о коде. Я не могу ясно понять без кода

нет. Мне платят за написание кода; Если вы хотите, чтобы я написал код для вас, вам придется заплатить мне. И код займет гораздо больше места и времени, чем описание выше.

Реализация правильной опции "запомнить меня" и завершение сеансов удаленно?

Насколько это безопасно?

Нифига вообще не безопасно, тупо можно перебором всех “попробовать порулить”. Большая такая дыра. Ну, пока не заметили – все ок, но кто-то обязательно заметит, 148%.

И по поводу опции с запоминанием сессии, это как сделать безопасно?

Уже написали, в принципе смысл – не хранить какие-то явно связывающие данные типа логина или айди в качестве ключа, а генерировать случайный хеш/ключ, который хранить на клиенте и на сервере.

И также мне всегда нравилось, что сессии можно закрывать удаленно(как это сделано в телеграме).

Не понял о чем речь, удаленно это из туалета когда комп в комнате? или из тайного центра тайного правительства отключать клиенту сессию и интернет? О чем это вообще?

Но как быть, если сессия на клиенте просто пропадет?

Сессия (внезапно) не может пропасть на клиенте, по тому как ее там никогда не бывает, бывает там только сессионная кука – ключ к сессии, которая (сессия) – на сервере, так что вопрос в данной формулировке смысла не имеет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *