Forgot Password Reset
Password reset कैसे काम करता है
चूँकि passwords सिर्फ़ hashes के रूप में store होते हैं, आप भूला हुआ "देख" नहीं सकते। इसके बजाय, forgot-password flow साबित करता है कि user अपना email control करता है और उसे नया password set करने देता है। यह एक one-time token इस्तेमाल करता है: request → link email → token verify → नया password set।
चरण 1: Reset माँगना
<?php
$email = trim($_POST["email"]);
// जाँचिए email users table में है (prepared statement)
$stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch();
?>
User अपना email submit करता है। हम इसे prepared statement से देखते हैं। अगर मौजूद हो, तो reset token बनाने पर बढ़ते हैं।
Token expiry के साथ store
<?php
$token = bin2hex(random_bytes(32)); // secure random token
$expiry = date("Y-m-d H:i:s", time() + 3600); // 1 घंटा
$stmt = $pdo->prepare(
"UPDATE users SET reset_token = ?, reset_expiry = ? WHERE email = ?"
);
$stmt->execute([$token, $expiry, $email]);
?>
हम random_bytes से लंबा random token generate करते हैं और उसे database में एक-घंटे की expiry के साथ save करते हैं। इसे server-side store करना हमें बाद में verify करने देता है।
Reset link email करना
<?php
$link = "https://yoursite.com/reset.php?token=$token";
$body = "Click to reset your password (valid 1 hour):\n$link";
// $body को email से भेजिए (PHPMailer / SMTP)
?>
हम token रखता एक link email करते हैं। जब user इसे click करे, वो token URL में लिए reset page पर पहुँचता है, verify होने को तैयार।
चरण 2: नया password set करना
<?php
$token = $_GET["token"] ?? "";
$stmt = $pdo->prepare(
"SELECT id FROM users WHERE reset_token = ? AND reset_expiry > NOW()"
);
$stmt->execute([$token]);
$user = $stmt->fetch();
if ($user) {
$newHash = password_hash($_POST["password"], PASSWORD_DEFAULT);
$upd = $pdo->prepare(
"UPDATE users SET password = ?, reset_token = NULL WHERE id = ?"
);
$upd->execute([$newHash, $user["id"]]);
echo "Password updated";
} else {
echo "Invalid or expired link";
}
?>
हम token सिर्फ़ तब स्वीकार करते हैं जब वो मेल खाए और expire न हुआ हो (reset_expiry > NOW())। नया password password_hash से hash होता है, और token clear हो जाता है ताकि दोबारा इस्तेमाल न हो।
आम गलतियाँ
- असली password email करना। आप नहीं कर सकते — यह सिर्फ़ hash है। token link email कीजिए।
- कमज़ोर tokens।
random_bytesइस्तेमाल कीजिए,rand()याmd5(time())नहीं। - कोई expiry नहीं। हमेशा token पर expiry set और जाँचिए।
- Token clear न करना। इस्तेमाल के बाद हटाइए ताकि link दोबारा इस्तेमाल न हो।
सारांश
- Hashed password recover नहीं कर सकते — उसे token से reset करते हैं।
random_bytesसे secure token generate कीजिए और expiry के साथ store कीजिए।- Token रखता link email कीजिए; password कभी email न कीजिए।
- Token और expiry verify कीजिए, फिर नया hashed password set कीजिए।
- इस्तेमाल के बाद token clear कीजिए ताकि link one-time हो।
आगे, hashing समझिए password hashing में, या login बनाइए login और registration में।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
Forgot-password flow कैसे काम करता है?
Password email करने के बजाय token क्यों?
Reset token expire क्यों होना चाहिए?
Secure token कैसे generate करूँ?
bin2hex(random_bytes(32)) इस्तेमाल कीजिए। rand() या md5(time()) जैसे कमज़ोर functions से बचिए, जो अंदाज़ा लगाने योग्य हैं।क्या नया password hash होना चाहिए?
password_hash() से hash कीजिए, बिल्कुल signup जैसा। Database में कभी plain password नहीं होना चाहिए।