我正在构建一个在树莓派上运行的仪表板系统,并为所有新用户预先生成密码及其哈希值。
我曾经这样做的那一行是 (‘@’, )。
用户首次登录时会看到密码重置窗口。用户在此密码重置页面点击提交后,我可以成功使用 () 和 ()。
第一次登录正常,但是注销后的任何登录尝试都会导致 () 失败。
我检查过/尝试过的内容
我知道的
哈希字符串与 中返回的内容相匹配。我在其他项目中使用了以下函数,使用的是 PHP 7。这个项目是在 PHP 8 上的。(这可能是问题吗?)
密码重置功能
public function firstLoginUpdatePassword($username, $password, $confirm, $token)
{
if ($password != $confirm)
{
header("Location: first-login?mismatch&token=" . $token);
exit;
}
else
{
$newPassword = password_hash($password, PASSWORD_DEFAULT);
$token = bin2hex(openssl_random_pseudo_bytes(16));
try
{
$stmt = $this->con->prepare("UPDATE Account SET Password=:password, isFirstLogin=FALSE, Token=:token WHERE Username=:username");
$stmt->bindparam(":username", $username);
$stmt->bindparam(":password", $newPassword);
$stmt->bindparam(":token", $token);
if ($stmt->execute())
{
header("Location: home");
exit;
}
else
{
header("Location: first-login?error&token=" . $token);
exit;
}
}
catch (PDOException $ex)
{
echo $ex->getMessage();
}
}
}
登录功能
public function Login($user, $pwd)
{
try
{
$stmt = $this->con->prepare("SELECT Username, Password FROM Account WHERE Username=:username or Email=:username;");
$stmt->bindparam(":username", $user);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($stmt->rowCount() == 1)
{
if (password_verify($pwd, $row['Password']))
{
try
{
$stmt = $this->con->prepare("UPDATE Account SET LastLogin=CURRENT_TIMESTAMP WHERE Username=:username;");
$stmt->bindparam(":username", $row['Username']);
if ($stmt->execute())
{
$_SESSION['userSession'] = $row['Username'];
return true;
}
else
{
header("Location: login?error-other");
exit;
}
}
catch (PDOException $ex)
{
echo $ex->getMessage();
}
}
else
{
header("Location: login?error-credential");
exit;
}
}
else
{
header("Location: login?error-login");
exit;
}
}
catch(PDOException $ex)
{
echo $ex->getMessage();
}
}
© 版权声明
本站下载的源码均来自公开网络收集转发二次开发而来,
若侵犯了您的合法权益,请来信通知我们1413333033@qq.com,
我们会及时删除,给您带来的不便,我们深表歉意。
下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,访问及下载者下载默认同意本站声明的免责申明,请合理使用切勿商用。
THE END
暂无评论内容