Zend Framework 2电子邮件令牌验证

时间:2016-08-23 13:35:40

标签: php email zend-framework2 token verification

我正在尝试建立一个系统(在Zend Framework 2中),通过发送带有令牌链接的电子邮件来验证用户注册的电子邮件(例如:http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9),这样如果在数据库预先注册的帐户移至验证状态。

我在module.config.php中使用的路径如下:

'verify' => array(
            'type'    => 'Segment',
            'options' => array(
                'route'    => '/user/autenticate/verify/:token',
                'defaults' => array(
                    '__NAMESPACE__' => 'User\Controller',
                    'controller'    => 'Autenticate',
                    'action'        => 'verify',
                ),
                    'constraints' => array(
                    'token' => '[a-zA-Z0-9]{30}'
                ),
            ),
        ),

然后在AutenticateController.php中,使用以下操作方法:

public function verifyAction()
{
    sleep(3); // Delay against brute attack (is it useful?)
    $token = $this->params()->fromRoute('token');
    $registerverification = new RegisterVerification();

    try {
        $registerverification = $this->getRegisterVerificationTable()->getRegisterVerification($token);

        // If arrives here (no exception) means that the token was in the database
        $aux = $this->getRegisterVerificationTable()->deleteRegisterVerification($token);
        $user = new User();
        $user = $this->getUserTable()->getUser((int)$registerverification->id);
        $user->verified = date("Y-m-d H:i:s");
        $this->getUserTable()->saveUser($user);

        $this->flashMessenger()->addMessage("Now your account is active");
    } catch (\Exception $e) { // Could not find row: $token

        $this->flashMessenger()->addMessage($e->getMessage()); 
    }
    return array();
}

这样的verify.phtml:

<?php
echo $this->flashMessenger()->render();
?>

这是有效的,但不是第一次尝试,而是仅在刷新网址(http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9)之后。

在第一次调用URL时,有什么人可以帮我解决AutenticateController.php的方法verifyAction()的问题吗?

1 个答案:

答案 0 :(得分:2)

flash messenger旨在显示 next 请求中的消息,因此您可能希望在添加成功消息后重定向到另一个URL。这可能是唯一的问题(否则请告诉我们第一次请求会发生什么)。