2016-05-25 3 views
0

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

  1. Пользователь обращается к webapp.
  2. Приложение запрашивает адрес электронной почты.
  3. На адрес отправляется электронное письмо, содержащее уникальную ссылку (токен).
  4. Пользователь нажимает на ссылку для входа без пароля.

Я разрабатываю webapp используя Symfony3, и я подумал об использовании пакета FriendsOfSymfony. Как я могу добиться этого? FOSUserBundle не является обязательным.

ответ

0

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

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

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

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

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

Примеры

Symfony 2: AutoLogin

0

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

послал 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 
    ) 
); 

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

0

Существует услуга называется 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