Сейчас куда ни глянь, пошла мода в качестве имени при авторизации использовать не пресловутый login, а адрес электронной почты. И это действительно удобно. Адрес почты уникален для каждого пользователя, хорошо запоминается самим пользователем и не возникает проблемы вроде той, когда при регистрации вам говорят, мол, извините, но пользователь «Яша» уже существует, попробуйте «Яша1, Яша2 или Яша3».
Базовая система регистрации в drupal (друпал) требует от пользователя ввести логин и адрес электронной почты. При этом пароль генерируется сайтом и отправляется на указанный email. Оба введенных значения должны быть уникальны для сайта. Мне кажется, что логичным будет для одного уникального пользователя требовать одного уникального значения (email). Логин оказывается лишним, т.к. email нам необходим для отправки пользователю пароля. Сделаем две вещи.
- Пусть сайт не требует ввода логина при регистрации, пусть он генерируется автоматически. Пусть это будет какой то набор цифр (вроде номера телефона или ICQ).
- Авторизация на сайте производится как по сгенерированному номеру (логину), так и по адресу электронной почты.
Избавляемся от поля «login» при регистрации.
Начать стоит с создания папки модуля. Назовем этот модуль, для определенности, mailLogin. Запрограммируем зацепку к форме регистрации, которая прячет поле логин, и добавляет обработчик к отправке формы регистрации.
1 2 3 4 5 6 7 8 9 10 |
/* зацепка к форме регистрации */ function mailLogin_form_alter(&$form, $form_state, $form_id) { switch ($form_id) { case 'user_register': $form['account']['name']['#type'] = 'hidden'; $form['account']['name']['#value'] = _mailLogin_generateLogin(); $form['#submit'] = array('user_register_submit', '_mailLogin_afterregister'); break; } } |
В зацепке использованы имена двух новых функций. Первая из них _mailLogin_generateLogin() должна нам вернуть сгенерированный автоматически login, правильный с точки зрения системы и ещё пока никем на сайте не использованный. Вот пример реализации такой функции.
1 2 3 4 5 6 7 8 9 |
/* псевдослучайный генератор логинов */ function _mailLogin_generateLogin() { do { $UIN = rand(100000000, 999999999); $res = db_query("SELECT uid FROM users WHERE name = '$UIN'"); } while (mysql_num_rows($res)); return $UIN; } |
Вторая функция — _mailLogin_afterregister() вызывается после регистрации пользователя и может содержать переход на какую то страницу с информацией для нового пользователя (ф-ция drupal_goto(«uri_page_where_to_go»)), выполнять какие то дополнительные действия, связанные с самой регистрацией, и т.д. И это к предмету разговора не относится, но пользуясь возможностью, демонстрирую, как наладить альтернативное движение пользователя после регистрации. Методов на самом деле много, и этот метод как вариант среди них.
Двойная авторизация (как по email так и по login-у)
Фактически мы никак не нарушили механизм регистрации. У нас есть уникальный логин и уникальный email. Другое дело, что пользователю не пришлось придумывать себе логин и вводить его при регистрации. Теперь добавим код, который поможет нам авторизоваться по введенному пользователем адресу электронной почты. Все намного проще, чем можно себе представить. Следующий php-код нужно вставить просто как часть кода нашего модуля (он выполняется вне какой либо функции).
1 2 3 4 5 6 7 8 |
//модификация POST данных для работы авторизации при вводе email if ($_POST['form_id'] == 'user_login') { if (valid_email_address($_POST['name'])) { $mail = mysql_escape_string(trim($_POST['name'])); $login = db_result(db_query("SELECT name FROM users WHERE mail like '$mail'")); if ($login) $_POST['name'] = $login; } } |
Мы проверяем, не отправляются ли данные авторизации (код формы user_login). Проверяем, не является ли login по сути email и ищем пользователя с таким email в базе данных. Выбрав логин этого пользователя из базы, мы подставляем найденное значение вместо логина в массив _POST. Далее, CMS сама уже отрабатывает необходимые действия, связанные с авторизацией, как это происходило бы без нашего вмешательства.
И вам уже решать нужно ли эти 10-15 строк оформлять отдельным модулем :). См. также авторизацию по номеру телефона в Drupal 7.
Есть аналогичное решения или готовый плагин для WordPress?
С готовыми плагинами не встречался, но даже если не удастся подобрать нужный хук вот в api-кодексе, то можно написать свой виджетик с формой авторизации, где email будет преобразовываться в login и передаваться на авторизацию встроенными средствами WP.
Спасибо!
Сам начинаю потихоньку разбираться и очень помогло.
Я так понимаю что заместо
» $res = db_query(«SELECT uid FROM users WHERE name = ‘$UIN'»);
} while (mysql_num_rows($res));»
можно написать
«$res = user_load(array(‘name’ => $UIN));
} while ($res);
»
?
Или тут есть какие-то «камни»? Естественно кроме производительности)
Я думаю, вы вполне можете использовать любые понравившиеся вам конструкции :). Камни если возникают то при переходе с одной версии drupal на другую, что происходит в жизни проектов довольно редко.
логин можно и железно сгенерить, чтобы не делать запрос к базе.
$UIN = time().rand(100, 999);
В таком варианте вероятность практически равна нулю.
Как можно сделать, чтобы идентификатором на сайте служил не email, а номер телефона? Механизм отправки СМС существует, но как сделать так, чтобы мог зарегиться человек, не имеющий электронной почты?
Интересная тема, Сергей. Это в отдельной статье нужно писать уже. Вкратце, если сохранять поле email, а поле с тел добавить в профиль, то можно выполнить авторизацию по точно такой же схеме, как в статье. Получится как во вконтакте, где можно авторизироваться по email и по номеру телефона. Будут и некоторые нюансы, конечно.
Более подробно можно прочитать вот тут — http://shra.ru/2015/10/avtorizaciya-po-nomeru-telefona-v-drupal/, там же есть обсуждение некоторых нюансов.