Я пытаюсь сделать систему (в Zend Framework 2) для проверки электронной почты пользователя, отправив электронное письмо со ссылкой с токеном (например: http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9), поэтому, если найден токен в базе данных предварительно зарегистрированная учетная запись переходит в состояние VERIFIED.Проверка маркера электронной почты Zend Framework 2
Я использую маршрут в 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();
?>
Это работает, но не с первой попытки, но только после обновления URL-адреса (http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9).
Может ли кто-нибудь помочь мне в том, что мне нужно сделать, чтобы метод verifyAction() для AutenticateController.php выполнялся при первом вызове URL-адреса?
Wonderful @Tim! Я создал новый checkanswerAction (с его видом и его маршрут) и просто добавил _return $ this-> redirect() -> toRoute ('verifyanswer'); _ и конец verifyAction вместо предыдущего _return array(); _ и он отлично работает. –
Кстати @Tim (я не знаю, могу ли я спросить об этом здесь), считаете ли вы, что полезно использовать инструкцию _sleep (3); _ в начале verifyAction() против бота, пытающегося использовать токены? –
Возможно, вы захотите переместить сон в ваш catch {} (так что только люди, подающие недействительные токены, наказываются). –