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

Рейтинг: 1Ответов: 1Опубликовано: 31.03.2015

Всем привет.
Занимаюсь переделкой формы авторизации, возник вопрос как правильно реализовать "Запомнить меня". Есть мысль при регистрации записывать хеш юзеру в куку и в базу, а затем при каждом заходе сравнивать хеши и если все верно, то генерировать новый хеш и обновлять его в куке и базе. Правда не знаю как тогда быть с ситуацией, если новый сгенерированный хеш сопрут и сразу же подставят для незаконной авторизации.
В инете к сожалению пока ничего путного ненагугли по этому вопросу, решил узнать тут у более опытных коллег как правильно и безопасно реализовывать это :)
UP от 1.04
Я тут подумал, мой вариант же будет работать только при условии, что запоминается только на одном рабочем месте, т.е. если "запомниться" на работе, то авторизация дома слетит, т.к. хеш поменяется же, и при авторизации дома слетит "запоминалка" на работе, т.к. хеш опять смениться. Как быть?

Ответы

▲ 2

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

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

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

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

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