Столкнувшись с задачей активации аккаунта, сперва решил не изобретать велосипед, а конечно же взять его напрокат. Но, оказалось, что в интернете по ключевым словам "подтверждение регистрации 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>',

    '[email protected]',

    $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

  • Динамически генерируемые картинки в Zend Framework

  • ВСЕМ ПРЕД)))))))))

  • Пробный набор петель

  • Ваш комментарий


    Вы должны войти в систему, чтобы оставить комментарий.