繁体   English   中英

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

[英]Login on webapp by token sent by e-mail

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

  1. 用户访问Web应用程序。
  2. 该应用程序请求一个电子邮件地址。
  3. 包含唯一链接(令牌)的电子邮件将发送到该地址。
  4. 用户单击链接即可登录,无需输入密码。

我正在使用Symfony3开发webapp,并且想到了使用FriendsOfSymfony用户捆绑包。 我该如何实现? FOSUserBundle不是必需的。

您想要实现的登录功能与通过电子邮件重置密码没有太大的区别。 除了用例中的临时令牌用于对用户进行身份验证,而不是对密码重置进行身份验证。

一个非常简单的解释

您应该创建一个存储身份验证令牌的实体,例如具有usertokentimestamp属性的AutoLogin

在您的“验证表单”提交一份新的AutoLogin记录都存储有对用户关系和用户得到通过电子邮件通知。

每当用户单击链接时,您都应该具有一种方法,该方法可以验证时间范围内的时间戳,并由用户提供者对用户进行身份验证。

例子

Symfony 2:自动登录

我认为在您接受电子邮件之后,您可以执行以下操作:

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

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

假设您有类似我查询中的表格。 希望我回答得很好

有一个名为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM