Распространение сотовой связи сделало уместным идентификацию пользователя по номеру телефона. Этот номер стал на ряду с логином и адресом электронной почты одним из уникальных параметров в профиле. Большинство социальных сетей позволяют не только привязать номер телефона к учетной записи, но и использовать его как пару логин-пароль при входе в аккаунт.
Далее я покажу как сделать авторизацию по номеру телефона в Drupal (версии 7).
Я уже рассказывал как сделать авторизацию по email в drupal. Подход ничуть не изменился.
Телефон не является дефолтным параметром учетки, поэтому соответствующее поле нужно добавить. Шагаем на страницу /admin/config/people/accounts/fields, где добавляем поле для ввода телефона.
Я показываю создание поля с той целью, чтобы потом не пояснять структуру запроса к базе, т.к. имя поля определяет имя таблицы в базе — у нас это будет таблица field_data_field_tel.
Когда поле создано, его значение можно задать на странице профиля.
Структура готова, напишем код, использующий для авторизации номер телефона. Кроме номера телефона, пусть будет возможна авторизация и по email, как было в примере, на который я ссылался выше. Но сейчас код будет адаптирован для Drupal 7.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//модификация POST данных для работы авторизации при вводе email или телефона if (!empty($_POST['form_id']) && $_POST['form_id'] == 'user_login') { //нормализация введенной строки $norm = mysql_escape_string(trim($_POST['name'])); $login_r = false; if (valid_email_address($norm)) { //возможно ввели email $login_r = db_query("SELECT name FROM users WHERE mail like '$norm'"); } else { //возможно ввели номер телефона? $login_r = db_query(" SELECT users.name FROM field_data_field_tel INNER JOIN users ON field_data_field_tel.entity_id = users.uid WHERE field_tel_value = '$norm' AND entity_type = 'user'"); } //если запрос вернул какие то данные, то выполним подстановку if ($login_r !== false || $login_r->rowCount()) { $login = $login_r->fetchObject(); $_POST['name'] = $login->name; } } |
Этот код не обернут в какую либо функцию, он размещается в любом вашем модуле. Цель — вычислить до обработки данных формы авторизации имя пользователя по введенному телефону или адресу электронной почты.
Этот вариант вполне будет работать, и его можно применять в каких то проектах. Но он имеет ряд проблем.
Нормализация номера телефона
Первое, с чем можно столкнуться, это правила написания номера телефона. Его можно записывать по разному, с пробелами и скобками, начиная с «+7» или «8», использовать дефисы и т.п. Пользователь в итоге может забыть, как он ввел номер в своем профиле. Ему не удастся войти, хоть он и укажет свой номер телефона, т.к. строка в базе не будет соответствовать введенному значению.
Вторая задача, также связанная с необходимостью нормализации номера, — это требование уникальности номера, связанного с учетной записью. Т.е. при вводе телефона, вы должны убедиться, что этот номер телефона не используется в других учетных записях.
Выход состоит в том, чтобы хранить наряду с произвольным текстовым видом, служебное поле с нормализованным видом номера.
Вот какой может быть логика получения нормализованного номера телефона.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//удаляем все символы кроме цифр $tel = preg_replace("/[^\d]+/", '', $_POST['tel']); $numlen = strlen($tel); //проверяем кол-во цифр в номере switch ($numlen) { case 0: //случай когда номер убрали, т.е. отвязали от учетки break; case 10: //идеальный случай ввода //т.е. ввели что то вроде: (123) 123-45-67 break; case 11: //ввели номер с +7 или 8 впереди, //они не несут важной информации //потому удалим цифирку спереди $tel = substr($tel, 1); break; default: if ($numlen) > 11) { //это уже не номер телефона, нужно препятствовать //сохранению такого номера //сообщением об ошибке } else { //номера длиной от 1 до 9, тоже не являются корректными //и их сохранять нельзя } } |
Как и где сохранять нормализованное представление решать уже вам.