三步而不是四步忘记密码功能
Posted
技术标签:
【中文标题】三步而不是四步忘记密码功能【英文标题】:Three rather than Four step forgot password functionality 【发布时间】:2012-01-25 12:07:06 【问题描述】:我正在使用 EZ Publish CMS:
目前正在发生的事情:
从忘记密码页面,用户输入他们的电子邮件地址 用于注册和提交
用户收到一封带有密码生成链接的电子邮件,其中 使用哈希来确认他们的身份。
用户收到一封带有新生成密码的电子邮件
用户使用电子邮件中的链接返回站点 到一个要求输入旧密码的表单(刚刚生成 并已发送到他们的电子邮件)并让他们输入新的 密码。
我想要发生的事情:
从“忘记密码”页面,用户输入他们的电子邮件地址 用于注册和提交
用户收到一封电子邮件,其中包含指向“输入新密码”表单的链接
在“输入新密码”表单中,用户无需输入旧密码 密码,因为身份已经通过哈希确认,并且 因此只需输入新密码。
我正在使用 EZMBPAEX 扩展,它具有原始的 4 步流程。 似乎没有任何关于删除“通过电子邮件向用户发送新密码”步骤的文档或讨论,但我的客户有一个非常严格的没有通过电子邮件发送密码的政策,所以我不能灵活使用这个。
有谁知道我在哪里可以找到有关如何编辑此功能的文档?
我认为需要编辑的文件位于:/extension/ezmbpaex/modules/userpaex/forgotpassword.php
【问题讨论】:
我喜欢你第 3 步的设计,好像我在使用“我忘记密码”链接,然后被要求使用我的旧密码来设置新密码,我会很沮丧... 是的,尽管“旧密码”这个词是指电子邮件中发送给用户的密码,但实际上它很混乱。 这看起来很有希望...编辑带有扩展的内核类。 ezpedia.org/solution/… 如果你已经解决了这个问题,你能关闭这个问题吗?让这个地方保持整洁。 如何结束这个问题?我有 28 声望的权限吗? 【参考方案1】:首先创建一个函数来为你生成一个随机字符串,假设你需要创建一个32个字符的随机字符串,选择你想要的任意数量的字符
生成随机代码的功能,该随机代码将通过电子邮件发送并添加到数据库中
function genRandomString()
$length = 32;
$characters = "0123456789abcdefghijklmnopqrstuvwxyz";
$string ="";
for ($p = 0; $p < $length; $p++)
$string .= $characters[mt_rand(0, (strlen($characters))-1)];
return $string;
接下来,使用 php myAdmin 创建一个新表,一个名为 forget_passes 的表,其中包含三列,假设您已经这样做了
$key = genRandomString(); // assign random code
$assign = $db->query("INSERT INTO `YOUR_DB_NAME`.`forgotten_pass` (`email` ,`randomKey` , `time`)
VALUES ('$email', '$key', CURRENT_TIMESTAMP );");
接下来发送一封电子邮件,其中包含指向您的 resetpassword.php 页面的链接(用户要求选择新密码并确认的页面,但不要忘记将生成的密钥分配给 get 变量,这很简单,只需当你链接
www.yourdomain.com/pass_reset.php (添加?secretkey=THE_GENERATED_HERE)
所以发送到需要重置密码的人的电子邮件地址的链接应该包含如下内容:
您好用户名,要重置您的密码,请单击下面的链接或将其复制/粘贴到您的浏览器中
链接:http://www.yourdomain.com/pass_reset.php?secretKey=a12s236d5c8d4fkejus10a1s2d4c8741
当用户点击该链接时,他将进入一个验证他的电子邮件及其在sql数据库中对应的随机密钥的页面,如果它发现确实有一个电子邮件和那个随机密钥,那么用户就真的确认它是电子邮件,因此此页面应包含以下内容:
<?php
if (isset($_GET['secretKey']))
$secretKey = $_GET['secretKey'];
// Check wether it really exist in database
$sql = 'select * from forgotten_pass WHERE email=$The_User_Email and randomKey='$secretKey'';
现在,只需统计行数,看看是否有返回数据,如果有返回数据,则不是用户真正连接到其收件箱并点击了链接。
只需执行以下操作:
if mysql_num_rows($sql)>0 echo "Success, ";
?>
// in this part type the html code which displays two inputs text, password
// and confirm password that connect to database and update the user's password
<form method="post" action="passupdate.php">
<input name="password" value =""/>
<input name"confirmedPassword" value=""/>
<input type="submit" value="Save my new password">
</form>
<?php
else
echo "Sorry, invalid reset link";
【讨论】:
【参考方案2】:当我更新插件时,它有我想要的步骤数。
【讨论】:
以上是关于三步而不是四步忘记密码功能的主要内容,如果未能解决你的问题,请参考以下文章