как работает чекбокс запомнить меня
Реализация функционала запомнить меня
Продолжаем работать и усовершенствовать нашу форму авторизации. Если Вы прочитали предыдущие статьи, то у Вас уже должны быть созданы формы регистрации и авторизации с функционалом подтверждения адреса электронной почты и с возможностью восстановить забытый пароль.
А в этой статье мы добавим к нашей форме авторизации функционал » запомнить меня «, который избавит пользователя от требования пройти авторизацию при каждом входе на сайт. Данный функционал работает следующим образом: при первом входе на сайт, если пользователь поставит галочку » запомнить меня «, то, у него на компьютере, на некоторое время, сохранится кука с неким токеном. С помощью этой куки, при следующем входе на сайт, пользователь авторизуется автоматически.
Замечание! После скачивания архива с исходными файлами статьи, не забудьте поменять данные для подключения к базе данных и указать адрес Вашего сайта. Всё это нужно сделать в файле dbconnect.php.
Под следующим входом, имеется в виду, когда пользователь завершил работу на сайте и закрыл его, потом через некоторое время зашёл заново на сайт.
И так, первое что нам нужно сделать, это добавить сам чек бокс » Запомнить меня « в форму авторизации. Открываем файл » form_auth.php » и перед строкой с кнопкой » Войти » и ссылкой » Забыли пароль? » добавляем эту строку:
Идём дальше. Как мы знаем, обработчиком нашей формы является файл » auth.php «. Поэтому открываем его и перед тем как добавить данные авторизации в сессию, нужно добавить этот код:
Как Вы поняли, здесь мы обрабатываем чек бокс » Запомнить меня «. Если галочка была поставлена, то мы создаём куку, которая содержит некий токен. А если галочка не была поставлена, то мы удаляем созданную куку.
Токен мы добавляем в базу данных, для того чтобы при следующем входе на сайт, мы смогли с помощью него вытащить нужные данные из базы.
Как мы знаем куки не безопасны для хранения данных, поэтому нельзя добавить в куку открытый пароль, потому что злоумышленник может украсть куки и с помощью них узнать данные для авторизации. Поэтому вместо пароля мы используем токен.
С первой частью мы закончили. Идём дальше. Представим, что пользователь поставил галочку » запомнить меня » и успешно авторизовался. Он погулял по сайту, написал пару комментариев и после этого вышел с сайта. Когда он заново зайдёт на сайт, то он должен авторизоваться автоматически, ведь он указал, чтобы его запомнили.
Так вот, для того чтобы организовать эту автоматическую авторизацию мы должны использовать куку с токеном. Нам нужно добавить код в тот файл, который подключается на всех страницах сайта, чтобы пользователя авторизовали с любой страницы. Вдруг он добавит, какую-ту страницу в закладках браузера.
Поэтому открываем файл » header.php » и в начале файла, сразу после функции запуска сессии, добавляем этот код:
Здесь мы проверяем, если кука с токеном существует и она не пуста, то мы делаем запрос к базе для выборки почтового адреса и пароля, где значение поля » password_cookie_token «, равна со значением куки » $_COOKIE[«password_cookie_token»] «.
И если такая запись существует, то мы в сессию добавляем почтовый адрес и пароль указанного пользователя. Вот таким образом и сделали автоматическую авторизацию.
Это ещё не всё, остался один момент. При нажатии на кнопку » Выход «, мы должны удалить куку с токеном. Открываем файл » logout.php » и перед тем как удалить данные из сессии добавляем этот код:
Мы здесь проверяем, если существует кука с токеном, то мы очищаем поле » password_cookie_token » и запускаем механизм удаления самой куки с токеном.
Вот теперь всё. С функционалом » запомнить меня « мы закончили.
Замечание! После скачивания архива с исходными файлами статьи, не забудьте поменять данные для подключения к базе данных и указать адрес Вашего сайта. Всё это нужно сделать в файле dbconnect.php.
Похожие статьи:
Видео по теме:
Понравилась статья?
Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.
Поделиться с друзьями:
Подписаться на новые статьи:
Поддержите пожалуйста мой проект!
Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu1607@gmail.com. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.
Автор статьи: Мунтян Сергей
Check-box «Remember me»
Эмм. то есть после логаута в этой ситуации не нужно заново логиниться?
Эмм. то есть после логаута в этой ситуации не нужно заново логиниться?
Когда ты сделаешь логаут из приложения, то по идее, не должно быть введённого пароля и логина, по скольку чекбокс ведь установлен просто для запоминания сессии. Ну или, например, как у нашего провайдера, он заполняет автоматически логин и пароль когда кликаешь «Remember me» до того момента пока ты не нажмёшь «Delete» (удалить пароль и логин с автозаполнения).
Эмм. то есть после логаута в этой ситуации не нужно заново логиниться?
Когда ты сделаешь логаут из приложения, то по идее, не должно быть введённого пароля и логина, по скольку чекбокс ведь установлен просто для запоминания сессии. Ну или, например, как у нашего провайдера, он заполняет автоматически логин и пароль когда кликаешь «Remember me» до того момента пока ты не нажмёшь «Delete» (удалить пароль и логин с автозаполнения).
При чем тут автозаполнение вообще? Речь же о сессии, о кукисах (как самый распространённый вариант поддержания сессии), при логауте информация о сессии из кукисов удаляется. И при повторном открытии сайта, нужно заново логиниться. Автозаполнение лежит за пределами функциональности «remember me».
Смотрите скриншот. Чекбокс автоматически заполняет при каждом входе логин и пароль.
remember my setup.PNG 90,78К 37 Количество загрузок:
Смотрите скриншот. Чекбокс автоматически заполняет при каждом входе логин и пароль.
remember my setup.PNG 90,78К 37 Количество загрузок:
Значит в первый пункт: В зависимости от браузера.
Значит в первый пункт: В зависимости от браузера.
Хорошо, сойдёмся на этом. 🙂
Если обсуждать функциональность отдельно от окружения, то логин \ пароль нужно вводить всегда.
Если же принимать во внимание функционал браузера, то да он мог сохранить логин \ пароль и автоматически подставить в требуемые поля.
Реализовать checkBox в роли «запомнить»
Подскажите, пожалуйста, как мне сделать checkBox так же, как на программах и сайтах, там, где нужно произвести вход по имени и паролю, там всегда есть функция запомнить, чтобы при следующем входе программа уже не спрашивала имя и пароль.
2 ответа 2
Microsoft рекомендует следующий способ сериализации:
1. Выбираете пункт Settings в Solution.
2. Создаете переменную необходимого типа (в вашем случае bool).
Вопрос здесь не в checkbox’е, конкретная реализация в интерфейсе — дело десятое. Вам стоит подумать о том, как будет инсталлирована программа и где она будет хранить данные.
Если вы собираетесь хранить данные локально, это стоит делать в подкаталоге %APPDATA% с именем, как у вашей программы (по хорошему, конечно, вашей компании, но это, как я понимаю, в будущем). Данные будут доступны, понятно, только текущему пользователю ОС (ну и администратору, разумеется) — и это правильно.
По поводу хранения пароля, всё сложно. Если вы кладёте пароль в открытом виде, это «приглашение» украсть его. С другой стороны, даже если вы будете шифровать пароль, надёжного хранения пароля на локальной машине добиться вовсе невозможно, т. к. если ваша программа может его прочитать и расшифровать, а машина скомпроментирована, то и злоумышленник точно так же сможет. Поэтому возможно стоит шифровать, но не обещать никакой «безопасности» пользователю.
Хорошим компромиссом является хранение только имени пользователя, но не пароля. На то он и пароль, что известен только человеку.
Запомнить меня checkbox
У меня есть приложение winform которое имеет форму входа в систему. Я сохраняю информацию о пользователях в базе данных с тремя параметрами: имя пользователя, хешированный пароль, соль:
Я не могу сохранить введенный пароль напрямую и в следующий раз заполнить его textBox потому что я знаю некоторые программные средства, которые могут читать такие textBox файлы, как это, и это не защищает.
Вопрос:
Как я могу это сделать, не сохраняя пароль пользователя?
Если мне нужно сохранить некоторую информацию, как зашифровать их?
Нужно ли менять политику безопасности?
Обратите внимание, что это клиентское/серверное приложение и форма входа в систему, созданная для клиентской стороны.
Вы можете сохранить хешированное значение пароля в своей локальной базе данных, и у вас может быть скрытый флажок, в котором говорится, что вы заполнили информацию из базы данных, которая уже хеширована, и при запросе аутентификации вам не нужно хэшировать значение пароля еще раз.
РЕДАКТИРОВАТЬ Если пользователь пытается ввести пароль вручную, вы можете очистить значение текстового поля и изменить установленное флажком значение, так что теперь вы знаете, что значение не является хэшированным.
ИМХО, этого не может быть сделано. Если вы шифруете/хешируете/засовываете и сохраняете пароль в БД, вы не можете получить его обратно в виде обычного текста.
Конечно, вы можете обмануть пользователя (я расскажу вам), но вам нужно определить, что вы хотите сделать:
- Введите хотя бы пароль еще раз (каждый раз) даже после того, как пользователь попросит «запомнить меня». Это можно сделать легко, просто введите идентификатор пользователя и сохраните пароль. Никаких трюков. Легко и просто. Даже Google делает это для своих сайтов. Теперь трюк. Пусть пользователь вводит приложение без пароля, а просто имя пользователя. Вы можете просто ввести какое-то значение по умолчанию в поле пароля (пользователь будет считать, что пароль действительно извлекается, но вы будете программировать такой способ, когда всякий раз, когда выбирается опция «запомнить меня», вы просто заполняете эту информацию автоматически), и пусть пользователь переходит но это нехороший вариант, потому что потенциально любой, кто использует эту систему, сможет подключиться к вашему приложению. Вам необходимо будет позвонить по вашему требованию безопасности.
Согласно моему пониманию, если вы хотите remember me функциональность, вы должны/должны иметь ваш пароль, который хранится в любой форме для аутентификации пользователя.
Пользователь dbw просто разместил мой другой подход 🙂
Авторизация и механика чекбокса «запомнить меня» Есть решение
Тех. поддержка отфутболила сюда, вразумительного ответа от них добиться не смог.
Вопрос по механике работы чекбокса «запомнить меня». Мои ожидания по его работе следующие: если checked, то сессия авторизации хранится сколько угодно долго не зависимо от настройки php session.gc_maxlifetime сервера? Или у меня завышенные ожидания?
В чем разница состояний этого чекбокса?
Проблема описана была уже многими в разделе помощь, например в этой теме: https://support.webasyst.ru/fo.
3 ответа
Такой ответ получил от тех поддержки:
Работа механизма связанна с сессиями php, но прежде всего для неавторизованных пользователей, в этом случае работает session.gc_maxlifetime»
Я это понимаю так, что для авторизованного пользователя с отмеченной галочкой «запомнить меня» session.gc_maxlifetime ни на что не влияет. Поправьте если я ошибаюсь.
Стал ковырять и нашел баг на стороне авторизации вебасиста.
1) Форма авторизации на витрине /login/
При отправке формы с галочкой «запомнить меня» видим что отправляет два значения remember 1 и 0
Он и перезатирает то что выбирает пользователь.
2) Форма авторизации в бекенде /webasyst/
Там тоже самое только порядок инпутов обратный
Поэтому input hidden не перезатирает значение пользовательского