PHP логин пользователя автоматически после подтверждения электронной почты - PullRequest
1 голос
/ 07 декабря 2011

Я использую PHP Zend Framework для своего веб-приложения.Когда пользователи регистрируются, я отправляю им электронное письмо для подтверждения их адреса электронной почты, и когда они нажимают на эту ссылку - учетная запись активируется.

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

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

    $db = Zend_Db_Table::getDefaultAdapter();
    //create the auth adapter
    $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'user','email', 'password');
    //set the username and password
    $authAdapter->setIdentity($this->_getParam('email'));
    $authAdapter->setCredential(md5($this->_getParam('password')));


    //authenticate
    $result = $authAdapter->authenticate();

    if ($result->isValid()) {           
        $auth = Zend_Auth::getInstance();
        $storage = $auth->getStorage();

        $row = $authAdapter->getResultRowObject(array('user_id'));
        $userModel = new Model_User();
        $user = $userModel->loadUserProfile($row->user_id);
        $storage->write($user);
    }

Спасибо за вашу помощь

Ответы [ 2 ]

8 голосов
/ 07 декабря 2011

У вас есть оператор if для аутентификации имени пользователя и пароля. В случае, если кто-то проверяет свою электронную почту, вы имитируете этот процесс и позволяете пользователю аутентифицировать свою учетную запись с помощью электронной почты и ключа подтверждения.

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

   .
   .
   .
   $verified = $emailVerification->isValid( $email, $key );

    if ( $verified ) 
    {           
            $auth = Zend_Auth::getInstance();
            $storage = $auth->getStorage();

            $row = $authAdapter->getResultRowObject(array('user_id'));
            $userModel = new Model_User();
            $user = $userModel->loadUserProfile($row->user_id);
            $storage->write($user);
    }

После этого пользователь войдет в систему после того, как вы сохранили его пользовательские данные в хранилище Zend_Auth.

Я бы посоветовал после использования этого метода удалить ключ проверки из записи пользователя, чтобы гарантировать, что они не смогут войти через этот процесс снова, если они не забудут свой пароль, в случае, если вы назначите новый ключ проверки.

Надеюсь, это поможет!

1 голос
/ 07 декабря 2011

Я не знаком с Zend, поэтому я не посмотрел ваш код должным образом, но вот идея:

  1. Отправить письмо с подтверждением
  2. Создать сеанс после отправкипочта
  3. Подождите, пока ...
  4. После того, как пользователь нажал на почту, если сеанс все еще активен (обычно это ограничение по времени составляет около 20 минут), просто войдите в него.

В целях безопасности вы можете создать даже два сеанса.Первый будет хранить идентификатор, а второй - идентификатор.Гид также будет отправлен пользователю по ссылке для проверки.Поэтому, когда он / она нажимает на ссылку и возвращается обратно, вы сравниваете, совпадают ли guid и id или нет.Если это совпадает, просто войдите в систему, как вы сделали бы в сценарии входа.

...