۱ آرمین صادقیان
جلوگیری از logout شدن کاربر بعد از بسته شدن مروگر
جامعه پی اچ پی ایجاد شده در ۰۶ دی ۱۴۰۱

سلام. وقت بخیر

توی این پروژه از سشن استفاده میشه که مشکلش اینه که چون سشن روی سرور ذخیره میشه بعد از بسته شدن مرورگر کاربر اتوماتیک لاگ اوت میشه. حالا من برای حل این مشکل اومدم به این روش عمل کردم.

اول یه جدول توی دیتابیس ساختم به اسم 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();
}

میخواستم بدونم آیا این روش خوبیه یا برای این کار روش بهینه‌تری هم هست؟

ممنون

سلام آرمین جان

روشی که استفاده کردید کاربردی هست، اما بهتر هستش وقتی که کوکی رو میسازید بصورت httpOnly باشه تا امنیت بیشتری داشته باشه. (داکیومنت برای توضیحات بیشتر)

نکته بعدی در مورد سشن هست، خودِ سشن هم داره از کوکی استفاده میکنه و میتونید زمان انقضاش رو با استفاده از session_set_cookie_params تغییر بدید. (داکیومنت برای توضیحات بیشتر)

بهترین پاسخ
صادق برزگر ۰۶ دی ۱۴۰۱، ۱۰:۴۴