通过电子邮件发送的令牌登录webapp

时间:2016-05-25 08:40:30

标签: php email login fosuserbundle symfony

我正在构建一个应该托管在公司服务器中并通过Intranet使用的webapp。要求是:

  1. 用户访问webapp。
  2. 该应用程序请求一个电子邮件地址。
  3. 包含唯一链接(令牌)的电子邮件将发送到该地址。
  4. 用户点击链接无需密码即可登录。
  5. 我正在使用Symfony3开发webapp,我想到使用FriendsOfSymfony用户包。我该如何实现这一目标? FOSUserBundle不是强制性的。

3 个答案:

答案 0 :(得分:0)

您希望实现的登录功能与例如通过电子邮件重置密码。除了用例中的临时令牌用于验证用户,而不是验证密码重置。

一个非常简单的解释

您应该创建一个存储身份验证令牌的实体,例如AutoLogin usertokentimestamp属性。{/ p>

在提交“身份验证表单”后,新的AutoLogin记录会与用户建立关系,并通过电子邮件通知用户。

每当用户点击链接时,您应该有一个方法来验证时间范围的时间戳,并由您的用户提供商对用户进行身份验证。

实施例

Symfony 2:AutoLogin

答案 1 :(得分:0)

我认为在您接受电子邮件后,您可以这样做:

将网址发送到这样的电子邮件

<?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
    )
);

假设您的表格与查询中的表格相似。希望我能回答你好

答案 2 :(得分: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