На мой взгляд, это и новый виток в войне с ботами и предвестник авторизации в будущем.
Сегодня практически у каждого есть сотовый телефон, а в будущем это будет какой то персональный гаджет, заменяющий паспорт, банковскую карту, ключ и все остальные архаизмы идентификации — такое электронное удостоверение личности, которое позволяет и звонки принимать и покупки совершать и много ещё чего делать, попутно подтверждая, что вы — это вы. Возможно, придумают более надежные способы био-идентификации, и гаджет не будет даже хранить каких то ключевых элементов, т.е. гаджет не будет персонализирован, и с ним работать сможет любой человек, идентифицируясь в процессе работы.
А пока не пришло это замечательное время (когда у каждого в голове при рождении зашивают микрочип) мы попробуем добавить в drupal подтверждение авторизации по СМС.
Изначально в Drupal есть подтверждение регистрации по e-mail, когда случайно сгенерированный пароль отправляется по e-mail. Т.е. чтобы получить пароль для входа, надо указать действующий e-mail. Автоматизировать регистрацию при этом не сложно, чем пользуются наши друзья спамеры, т.к. зарегистрировать новый домен и тут же повесить на этот домен почтовый сервер, залить нужный софт по обработке почты — все это можно делать сейчас не слезая с дивана и даже не показывая паспорта.
Нам понадобится СМС-шлюз, в роли которого будет выступать — epochta.ru. Т.е. все что касается отправки СМС будет сделано на API этого сервиса. Друпал у нас будет версии 6, но для других версий коренным образом отличаться ничего не будет. Опять же слезать с дивана и показывать спамеру паспорт не потребуется, но автоматизировать процесс регистрации будет сложнее. И, главное, мы получим валидный номер сотового телефона, на который и новости сайта можно разослать (корпоративную рекламу) и восстановление пароля привязать к нему (дальше фантазируйте сами)…
Алгоритм
Алгоритм следующий — человек вводит анкетные данные как обычно на странице /user/register, а далее ему выводится сообщение — что мол, инструкции по активации высланы на почту. В настройках пользователя /admin/user/settings выбран режим — «Посетители могут создавать учетные записи, разрешение администратора не требуется.» и установлен флажок «Требуется подтверждение по электронной почте, когда посетитель создает учетную запись».
Учетная запись создается не активной (деактивируется сразу после создания), а в письме сообщается, что для активации требуется ввести код отправленный в СМС по указанному в форме регистрации номеру сотового телефона. Для создания поля используем штатный модуль profile, где настраиваем поле profile_tel.
Тут важно, чтобы поле отображалось в форме регистрации и было обязательно для ввода.
Страница с формой активации (у нас она будет по адресу /user/confirmation) содержит всего два поля — e-mail и код активации. При вводе верной пары значений учетная запись активируется, пользователь может ввести свои реквизиты (высланные ранее в письме) для авторизации на сайте.
Код на PHP для Drupal
Встраиваем следующие кусочки кода в существующий или новый модуль. У меня модуль назывался SMS.
1. Новые разделы сайта
Здесь я добавил пару страниц — на первой user/registration-successfull будет показано сообщение об успешной регистрации, на второй user/confirmation — форма для ввода кода подтверждения.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
function SMS_menu() { $items = array(); ... //успешная регистрация $items['user/registration-successfull'] = array( 'title' => 'Регистрация успешно завершена', 'page callback' => '_SMS_register_success', 'access arguments' => array('access content'), 'type' => MENU_NORMAL_ITEM ); //форма активации пользователя с помощью ввода СМС кода $items['user/confirmation'] = array( 'title' => 'Активация учетной записи', 'page callback' => '_SMS_activation', 'access arguments' => array('access content'), 'type' => MENU_NORMAL_ITEM ); return $items; } /* успешная регистрация */ function _SMS_register_success() { //что то вроде следующего текста return " <p>Благодарим Вас за регистрацию на сайте.</p> <p>По указанному Вами адресу электронной почты были высланы учетные данные (логин и пароль), а также ссылка на форму завершения регистрации. Чтобы завершить процесс регистрации, вам нужно будет ввести код, отправленный вам СМС на указанный Вами номер мобильного телефона. Если Вы указали верный номер мобильного телефона, то СМС-код должен прийти вам в течении часа.</p>"; } /* форма активации пользователя с помощью ввода СМС кода */ function _SMS_activation() { //обработчик формы if ($_POST['action'] == 'activate') { $res = db_query("SELECT uid, data FROM users WHERE status = 0 AND mail = '" . mysql_escape_string(trim($_POST['mail'])) . "'" ); if (mysql_numrows($res)) { $u = db_fetch_object($res); $data = unserialize($u->data); if ($data['SMScode'] == trim($_POST['SMScode'])) { $data['SMScode'] = 'user entered the code'; $u->data = serialize($data); db_query("UPDATE users SET status = 1, data = '%s' WHERE uid = %d", $u->data, $u->uid); return '<p>Ваша регистрация завершена, теперь вы можете пользоваться всеми привилегиями зарегистрированного пользователя.</p><p><a href="/user">Авторизироваться</a></p>'; } else { return '<p>Код не верен, либо не найден указанный адрес электронной почты.</p>'; } } else { return '<p>Код не верен, либо не найден указанный адрес электронной почты.</p>'; } } //HTML код формы, обойдемся без drupal FORM API return '<p>Для завершения регистрации Вам нужно ввести отправленный в виде СМС код.</p> <form method="POST"> <div> Ваш E-mail:<br /> <input type="text" name="mail" size="40" /> </div> <div> Код:<br /> <input type="text" name="SMScode" size="20" /> </div> <div> <input type="submit" name="sbm" value="Отправить!" /> <input type="hidden" name="action" value="activate" /> </div> </form>'; } |
2. Модификация обработки формы регистрации
Здесь надо добавить проверку поля с телефоном (верный ли синтаксис). А при отправке данных выполнить отправку СМС и переход на стр. с сообщением об успешной регистрации.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
function SMS_form_alter(&$form, $form_state, $form_id) { switch ($form_id) { //тут какие то другие обработчики ... //а вот форма регистрации case 'user_register': //тут возможно что то еще что вам необходимо для вашего сайта ... //добавим обработчики отправки и проверки данных $form['#submit'][] = 'SMS_user_register_submit'; $form['#validate'][] = 'SMS_user_register_validate'; break; } } //обработка верного заполнения полей формы регистрации пользователя function SMS_user_register_validate($form, &$form_state) { //выделим только цифры номера (отбросим скобки, тире и другие символы) $num = preg_replace("/[^\d]/", "", $form_state['values']['profile_tel']); //проверка формата (10 цифр с 7 или 8 в начале) if (!preg_match("/^[78]9[\d]{9}$/", $num)) { form_set_error('profile_tel', 'Номер телефона задан не верно!' . $num); } // ну и прочие обработчики ошибок, если это нужно ... } //обработка данных отправленных в форме регистрации function SMS_user_register_submit($form, &$form_state) { ... //реализация подверждения валидности акка через СМС $res = db_query("SELECT uid, data FROM users WHERE name = '%s' AND mail = '%s'", $form_state['values']['name'], $form_state['values']['mail']); if (mysql_numrows($res)) { $u = db_fetch_object($res); //формируем СМС код, например вот так: $SMScode = rand(10000, 99999); //запаковываем его в поле - data $data = unserialize($u->data); $data['SMScode'] = $SMScode; $u->data = serialize($data); //записываем код и гасим статус пользователя, чтобы заставить ввести его код полученный по СМС db_query("UPDATE users SET status = 0, data = '%s' WHERE uid = %d", $u->data, $u->uid); //далее отправляем СМС через epochta API $base = drupal_get_path('module', 'SMS'); require_once $base . '/epochta/APISMS.php'; require_once $base . '/epochta/Addressbook.php'; require_once $base . '/epochta/Exceptions.php'; require_once $base . '/epochta/Account.php'; require_once $base . '/epochta/Stat.php'; //авторизация на сервисе epochta $Gateway = new APISMS(ВАШ_ЗАКРЫТЫЙ_КЛЮЧ, ВАШ_ОТКРЫТЫЙ_КЛЮЧ, 'http://atompark.com/api/sms/'); $Exceptions = new Exceptions($Gateway); $Account = new Account($Gateway); $Stat = new Stat ($Gateway); //телефон для рассылки //отбрасываем мусор, перебиваем первую цифру на "7" $num = preg_replace("/[^\d]/", "", $form_state['values']['profile_tel']); $num[0] = '7'; //Проверяем баланс счета $res=$Account->getUserBalance(); if (isset($res["result"]["error"])) { die ("Ошибка: ".$res["result"]["code"]."<br>"); } else { $balance = $res["result"]["balance_currency"]; } //Проверим, хватает ли денег на запланированную рассылку $cost = 5; //максимальная цена 1СМС по прайсу if ($balance > $cost || true) { //отправка СМС от имени MyName //в некоторых странах требуется предварительная регистрация этого имени //её можно произвести в настройках сервиса epochta : //в разделе отправка СМС-> регистрация имени отправителя $res = $Stat->sendSMS("MyName", "Ваш код для регистрации на сайте - $SMScode", $num, "", 0); if (isset($res["result"]["error"])) { die("Ошибка: ".$res["result"]["code"]."<br>"); } } else { //недостаточно денег на рассылку //вообще надо пользователя то включить тогда, //а то он совсем не сможет войти на сайт, раз денег на СМС на л.с. нет // db_query("UPDATE users SET status = 1 WHERE uid = %d", $u->uid); } } //переход на страницу с сообщением об успешной регистрации drupal_goto('user/registration-successfull'); } |
Надо несколько слов сказать о сервисе EPochta.ru. Понятно, что для отправки СМС надо там зарегистрироваться, и отправка сообщений — услуга платная :). Вот полезные ссылки —
- описание протоколов обмена данными (если охота узнать чуть больше).
- пример использования на PHP и ссылки для скачивания PHP классов для работы с Epochta (как раз то что мы подключали в листинге выше через require_once $base . ‘….’)
После создания учетной записи, нужно будет настроить аккаунт для работы: сгенерировать публичный и приватный ключ (ВАШ_ОТКРЫТЫЙ_КЛЮЧ, ВАШ_ЗАКРЫТЫЙ_КЛЮЧ в листинге), поставить галочку «Активировать API 3.0». Файлы классов работы с epochta разместить в одноименной подпапке вашего модуля.
Есть у сервиса и тестовый режим, когда СМС не отправляется, но показаны соответствующие данные в статистике (что мол принято сообщение успешно) — чтобы деньги зря на тесты не тратить.
Будут вопросы — будут и ответы. Пишите в комменты к статье.
Привет
К 7 друпалу тоже было бы не плохо инструкцию добавить.