3 ответа

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

    Очень простое объяснение

    Вы должны создать сущность, которая хранит маркер аутентификации, напримерAutoLogin, который имеетuser, tokenи timestampсвойство.

    При отправке вашей «формы аутентификации» новая AutoLoginзапись сохраняется с отношением к пользователю, и пользователь получает уведомление по электронной почте.

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

    Образцы

    Symfony 2: AutoLogin

  2. Я думаю, что после того, как вы приняли письмо, это то, что вы можете сделать:

    отправлено url-адрес электронной почты, как это

    <?php
    $url = "http://example.com/login.php?token=$token";
    ?>
    

    Тогда вы войти страницу

    <?php
    // retrieve token
    if (isset($_GET["token"]) && preg_match('/^[0-9A-F]{40}$/i', $_GET["token"]))
    {
    $token = $_GET["token"];
    }
    else {
    throw new Exception("Valid token not provided.");
    }
    // verify token
    $query = $db->prepare("SELECT username, tstamp FROM pending_users WHERE token = ?");
    $query->execute(array($token));
    $row = $query->fetch(PDO::FETCH_ASSOC);
    $query->closeCursor();
    
    if ($row) {
        extract($row);
    }
    else {
        throw new Exception("Valid token not provided.");
    }
    
    // do action here, like activating a user account/redirect
    // ...
    
    // delete token so it can't be used again
    $query = $db->prepare(
        "DELETE FROM pending_users WHERE username = ? AND token = ? AND tstamp = ?",
    );
    $query->execute(
        array(
            $username,
            $token,
            $tstamp
        )
    );
    

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

  3. Есть служба под названиемfos_user.security.login_manager, которая может помочь:

    public function loginByTokenAction($token)
    {
      $em = $this->getDoctrine()->getManager();
      $user = $em->getRepository('AppBundle:User')->findOneByToken($token);
      $this->container->get('fos_user.security.login_manager')->loginUser('firewall_name', $user);
      // ...
    }
    

    источник : https://github.com/symfony/symfony/pull/13062