6 October 2014

Манипулирование учетными записями пользователя — шаблоны реализации

TheOnlyPage corporate blogWebsite developmentProgramming
image Тема этой публикации вряд ли заинтересует опытного разработчика веб-приложений.

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

Сразу оговорюсь, что регистрацию через социальные сервисы не рассматривается, так как в этом случае работа с учетными записями остается в зоне ответственности соответствующих социальных сервисов.

Все манипуляции с учетными записями пользователя сводятся к следующим:

  1. регистрация с подтверждением по электронной почте;
  2. смена некритичных настроек;
  3. смена критичных настроек — с подтверждением паролем;
  4. смена адреса электронной почты — с подтверждением по электронной почте;
  5. восстановление забытого пароля.


Так как эта статья располагается в хабе веб-сервиса TheOnlyPage, то в качестве иллюстраций будем использовать скриношоты работы с этим сервивисом.

Регистрация с подтверждением по электронной почте


Как правило, в качестве уникального идентификатора пользователя используется его адрес электронной почты, а пользователь должен подтвердить его использование:

В момент регистрации имеет смысл запрашивать минимально-необходимый набор сведений о пользователе, ограничившись адресом электронной почты и паролем.

image


Для контроля правильности ввода пароль указывается дважды.

После получения электронной почты и пароля, на указанный адрес отправляется письмо со ссылкой содержащей строку подтверждения. Строка подтверждения однозначно идентифицирует пользователя, который проходит регистрацию.

image


И пользователю сообщается об этом.

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

Подытожим алгоритм регистрации пользователя:

  1. получить адрес электронной почты и пароль
  2. отправить письмо со строкой подтверждения регистрации
  3. сообщить пользователю об отправке письма
  4. обработать клик по строке подтверждения и зарегистрировать пользователя

Интересным является вопрос: где хранить информацию о пользователях еще не подтвердивших свой адрес электронной почты: в отдельной таблице или вместе со всеми уже зарегистрированными пользователями.

Ответ на него очевиден: информацию о недозарегистрированных пользователях лучше хранить в отдельной таблице:

  • чтобы не возникало проблем с многократными незаконченными регистрациями для одного электронного адреса;
  • чтобы был порядок в работе с различными сущностями.


Смена некритичных настроек


У пользователя могут быть и какие-то другие атрибуты кроме адреса электронно почты и пароля. Доступ к редактированию и сохранению большинства из них не стоит ограничивать.

Чтобы пользователь мог, просто открыть необходимую форму:

image

И сохранить результат

image


Смена критически важных настроек


Самой первой из важных настроек, которые приходится иногда менять является пароль.

При сохранении нового пароля, как и любого другого важного атрибута пользователя, следует подтвердить сохранение вводом пароля.

image


Всегда новый пароль указывается дважды, чтобы не допустить ошибки ввода.

Важным моментом является способ хранения информации о пароле пользователя.

Существует множество старых, успешных веб-сервисов, сохраняющих в базе данных сами пароли. Это неправильно, недопустимо и все современные веб-приложения хранят не пароли, а их хеши.

Хеш это строка, сгенерированная из пароля и специальной секретной добавки (salt).

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

Подытожим алгоритм смены пароля:

  1. получить старый и новый пароли;
  2. сравнить хеш старого пароля с хешом хранящимся в базе данных;
  3. если хеши совпали: вычислить хеш для нового пароля и сохранить его в базе данных.

Смена электронной почты


Электронная почта является критически важным атрибутом, поэтому при ее смене стоит указывать пароль.

image


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

image


И пользователю сообщается об этом:

image


Пользователь получает письмо, кликает по ссылке содержащей строку подтверждения, веб сервис по строке подтверждения определяет пользователя и переадресовывает его на специальную страничку подтверждения владения учетной записью. В скрытом поле формы на этой страничке указывается специальная строка, однозначно идентифицирующую пользователя.

image


Пользователь должен ввести пароль, чтобы подтвердить владение учетной записью. Это нужно на случай ошибки в адресе, когда письмо-подтверждение получит посторонний человек. Чтобы он не мог присвоить чужую учетную запись, просто кликнув по ссылке в письме.

image


Пользователь указывает пароль, и подтверждает смену адреса.

Подытожим алгоритм смены электронной почты пользователя:

  1. получить адрес электронной почты и пароль;
  2. сравнить хеш пароля и хешом хранящимся в базе данных;
  3. если хеши совпали: отправить письмо со строкой подтверждения смены адреса
  4. сообщить пользователю об отправке письма;
  5. обработать клик по строке подтверждения и отобразить страницу подтверждения владения учетной записью;
  6. получить специальную строку и пароль пользователя, по специальной строке определить пользователя и убедиться в правильности пароля (аналогично п.2);
  7. если пароль правильный: заменить в базе данных старый электронный адрес на новый, а если хеш пароля вычисляется с использованием адреса электронной почты – то, одновременно вычислить и сохранить в базе данных новый хеш пароля.

Смена забытого пароля


При инициировании смены забытого пароля пользователь должен указать адрес электронной почты.

image


После получения адреса электронной почты на указанный адрес отправляется письмо со ссылкой содержащей строку подтверждения. Строка подтверждения однозначно идентифицирует пользователя, который восстанавливает пароль.

image


И пользователю сообщается об этом:

image


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

image


Как обычно новый пароль указывается дважды, чтобы не допустить ошибки ввода.

Подытожим алгоритм смены электронной почты пользователя:

  1. получить адрес электронной почты;
  2. отправить письмо со строкой подтверждения смены пароля;
  3. сообщить пользователю об отправке письма;
  4. обработать клик по строке подтверждения и отобразить страницу смены пароля;
  5. получить специальную строку и новый пароль пользователя, по специальной строке определить пользователя и сгенерировать хеш нового пароля и сохранить в базе данных;

Специальная строка, идентифицирующая пользователя


При регистрации, смене адреса и смене забытого пароля используется специальная строка (токен) идентифицирующая пользователя.

Есть два способа генерации таких строк:

Первый (с использованием базы данных):

Генерировать случайную последовательность и сохранять ее в базе данных в отдельной таблице с указанием id пользователя, типа, времени жизни этого сообщения. Затем, получив подобную строку обращаться к этой таблице и находить по строке id пользователя. Периодически чистить таблицу от накопившихся нереализованных сообщений.

Второй (с шифрованием):

Генерировать псевдослучайную последовательность зашифровав информацию об id пользователя, типе сообщения и времени жизни сообщения в самом сообщении. А при получении строки расшифровать и получить всю информацию без обращений к базе данных.

Вот как может выглядеть работа со специальной строкой (токеном) на языке python, с использованием библиотеки itsdangerous

При генерации токена

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# создаем сериализатор указав, используемый секретный ключ 
# и время жизни (в секундах) зашифрованной информации
serializer = Serializer('very_secreti_key', expires_in=60*60*24 )

# получаем специальную строку содрежащую всю информацию
id=1234567
token = serializer.dumps( {'newemail':  id} ) }

Получив специальную строку, можем извлечь из неё информацию

# создаем сериализатор указав, используемый секретный ключ 
serializer = Serializer('very_secreti_key')

# получаем зашифрованные данные:
# {'newemail':  1234567}
try:
  data = serializer.loads( token )

Очевидно, что второй способ, без использования дополнительной таблицы базы данных, является предпочтительным.

Tags: учётные записи манипулирование учетными записями user accounts
Hubs: TheOnlyPage corporate blog Website development Programming
+12
5k 117
Comments 21
Ads