簡體   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