-Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в Smile_ArT

 -Сообщества

Читатель сообществ (Всего в списке: 1) Scrittore_di_talento

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.10.2007
Записей:
Комментариев:
Написано: 380


Подтверждаем регистрацию по-своему

Вторник, 02 Декабря 2008 г. 22:31 + в цитатник

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

Так вот, мне показалось, что в ней очень многое сделано "не так". Начиная смешиванием PHP и HTML (причем на уровне прямо echo, а не нативного шаблонизатора), заканчивая каким-то мутным шифрованием, проверкой контрольной суммы, передачей email в ссылке активации через GET, ограничением по сроку активации и т.д. и т.д. и т.д.

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

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


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

2. Ссылка актвации в моём случае (так уж мне нравиться) должна уже содержать в себе email пользователя, причем в неявном виде (дальше поймете зачем мне это). Формировать ссылочку я решил без излишних понтов и написал такой код:


// при регистрации вставляем данные пользователя из массива в БД
$db->insert('users'$data);

// формируем код ссылки активации
$code md5((string)rand(100000000,999999999)).md5($this->getEmail());
           
// заполняем массив данных для помещения в БД
$actuation_data = array

(
    'code' => $code
);

// вставляем данные из массива в БД
$db->insert('actuation'$actuation_data);

$this->send

(
    'Your activation link: http://site.com/actuate/'.$code,
    'Your activation <a href="http://site.com/actuate/'.$code.'">link!</a>',
    'registration@site.com',
    $this->getEmail(),
    $this->getLogin(),
    'Подтверждение регистрации на site.com'
);



Условно говоря, это фрагмент реализации метода регистрации класа пользователя, причем код написан в стиле Zend Framework.

Само собой, подразумевается наличие в БД таблицы приблизительно следующей простой структуры:


Метод send вообще-то применен для примера, на самом деле все происходит на еще более высоком уровне. Но, в данном случае, первым идет параметр palin text формата для email'а, дальше html версия тела письма, мыло отправителя, соответственно и получателя, логин юзера и наконец тема.

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

3. Собственно, последним шагом будет получение пользователем письма, клик по ссылке и попадание на страницу обработки кода активации. код мы получаем из адресной строки. В ZF с этим просто, а кто пользуется простым $_GET, соответственно получает оттуда.

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

// создаем фильтр и пропускаем через него полученные данные
$filter = new Zend_Filter_Alnum();
$code $filter->filter($value);
        
// если код активации задан
if(!empty($code))
{
    $db get_db_connection();

    // удаляем такой код из списка ожидающих кодов активации, заодно узнаем был ли такой вообще
    $count $db->delete('actuation''code = '.$db->quote($code));
            
    //проверяем количество возвращенных кодов
    if ($count === 1)
    {
        // подготовим данные для записи в базу
        $data = array
        (
            'actuated' => true
        );
                
        // если такой код найден, активируем пользователя
        if ($db->update('users'$data"MD5(`email`) LIKE '".substr($code,32,63).''')>0)
        {
            // делаем что-то, например сообщаем об успешной активации
        }
        else
        {
            // сообщаем об ошибке активации
        }
    }
    else
    {
        // если такой код НЕ найден тоже можем сообщить об этом :)  
    }
}


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

Таким образом цель достигнута. Пользователь получает неудобочитаемую ссылку, которая является при этом мета-кодом активации, так как она содержит как сам код (его наличие в таблице кодов), так и проверяет email в таблице пользователя.

Сообщение добавлено через MovableType API

Рубрики:  Интернет и компьютеры
Программинг
Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку