سلام. وقت بخیر
توی این پروژه از سشن استفاده میشه که مشکلش اینه که چون سشن روی سرور ذخیره میشه بعد از بسته شدن مرورگر کاربر اتوماتیک لاگ اوت میشه. حالا من برای حل این مشکل اومدم به این روش عمل کردم.
اول یه جدول توی دیتابیس ساختم به اسم tokens:
CREATE TABLE `tokens` (
`id` int(10) UNSIGNED NOT NULL,
`user_id` int(10) UNSIGNED NOT NULL,
`token` varchar(128) NOT NULL,
`expire_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
با هر بار لاگین کاربر یه توکن ساخته میشه و توی این جدول ذخیره میشه و این توکن رو توی کوکی روی سیستم کلاینت ذخیره میکنیم:
function createLoginToken(int $userId, string $token): bool
{
global $pdo;
$sql = "INSERT INTO tokens (user_id, token, expire_at) VALUES (:user_id, :hashToken, NOW() + INTERVAL 604800 SECOND)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
":user_id" => $userId,
":hashToken" => $token
]);
return $stmt->rowCount() ? true : false;
}
function login(string $email, string $password): bool
{
$user = getUserByEmail($email);
if (is_null($user)) {
return false;
}
// Check the password
if (password_verify($password, $user->password)) {
$token = hash_hmac('sha256', $user->id, bin2hex(random_bytes(32)));
createLoginToken($user->id, $token);
setcookie("7Todo", $token, time() + 86400, "/");
return true;
}
return false;
}
و برای لاگ اوت کردن کاربر هم به این روش عمل میکنیم:
function deleteTokenRowByToken(string $token): int
{
global $pdo;
$sql = "DELETE FROM tokens WHERE token = :loginToken";
$stmt = $pdo->prepare($sql);
$stmt->execute([
":loginToken" => $token
]);
return $stmt->rowCount();
}
function logout()
{
deleteTokenRowByToken($_COOKIE['7Todo']);
setcookie("7Todo", "", time() - 86400, "/");
redirect();
}
میخواستم بدونم آیا این روش خوبیه یا برای این کار روش بهینهتری هم هست؟
ممنون