Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP में पासवर्ड रीसेट सिस्टम

किसी भी अच्छी सदस्यता वेबसाइट की एक बहुत ही महत्वपूर्ण विशेषता एक पासवर्ड रीसेट प्रणाली है क्योंकि कुछ उपयोगकर्ता अपना पासवर्ड भूल जाते हैं। इस ट्यूटोरियल में, मैं उपयोगकर्ता के पासवर्ड को पुनर्प्राप्त करने में शामिल चरणों की रूपरेखा तैयार करता हूं; हम इस ट्यूटोरियल में PHP और एक MySQL डेटाबेस का उपयोग करके ऐसी प्रणाली को भी लागू करेंगे।

ऐसी प्रणाली को लागू करने की पूरी प्रक्रिया को 3 मुख्य चरणों में विभाजित किया जा सकता है। स्पष्टीकरण को आसान बनाने के लिए, आइए इन चरणों का विश्लेषण उन रूपों के संदर्भ में करें जिन्हें हम उपयोगकर्ता को भरने के लिए प्रस्तुत करेंगे:

  1. लॉगिन फ़ॉर्म:  यह फ़ॉर्म उपयोगकर्ता का उपयोगकर्ता नाम और पासवर्ड संयोजन लेता है और यदि वे सिस्टम पर पंजीकृत हैं तो उन्हें लॉग इन करता है। इस फ़ॉर्म पर हम "अपना पासवर्ड भूल गए?" यदि उपयोगकर्ता अपना पासवर्ड भूल गया है और उसे रीसेट करने की आवश्यकता है तो लिंक करें।
  2. ईमेल फ़ॉर्म:  यदि उपयोगकर्ता अपना पासवर्ड भूल गए हैं, तो वे "अपना पासवर्ड भूल गए?" पर क्लिक कर सकते हैं। इसे रीसेट करने के लिए लॉगिन पेज पर लिंक करें। इस लिंक पर क्लिक करने से वे दूसरे पेज पर पहुंच जाएंगे जो उन्हें ईमेल दर्ज करने का संकेत देता है। जब वे जो ईमेल पता प्रदान करते हैं वह डेटाबेस में हमारे उपयोगकर्ता तालिका में नहीं होता है, तो हम प्रदर्शित करेंगे और त्रुटि संदेश जो कहेंगे "हमारे सिस्टम पर ऐसा कोई उपयोगकर्ता मौजूद नहीं है"। यदि दूसरी ओर उपयोगकर्ता मौजूद है, तो हम एक अद्वितीय टोकन (एक अद्वितीय यादृच्छिक स्ट्रिंग) उत्पन्न करेंगे और इस टोकन को उस ईमेल पते के साथ डेटाबेस में password_resets तालिका में संग्रहीत करेंगे। फिर हम उन्हें एक ईमेल भेजेंगे जिसमें एक लिंक में वह टोकन होगा। जब वे हमारे द्वारा भेजे गए ईमेल के लिंक पर क्लिक करते हैं, तो उन्हें हमारी वेबसाइट पर उस पृष्ठ पर वापस भेज दिया जाएगा जो उन्हें एक अन्य फ़ॉर्म के साथ प्रस्तुत करता है।
  3. नया पासवर्ड फ़ॉर्म:  एक बार जब उपयोगकर्ता फिर से हमारी वेबसाइट पर वापस आ जाता है, तो हम लिंक से आने वाले टोकन को पकड़ लेंगे और इसे एक सत्र चर में संग्रहीत करेंगे। फिर हम उन्हें एक फॉर्म के साथ प्रस्तुत करेंगे जो उन्हें हमारी वेबसाइट पर उनके खाते के लिए एक नया पासवर्ड दर्ज करने के लिए कहता है। जब नया पासवर्ड सबमिट किया जाता है, तो हम उस रिकॉर्ड के लिए password_resets तालिका को क्वेरी करेंगे जिसमें वह टोकन है जो अभी मेल में लिंक से आया है। यदि पासवर्ड_रीसेट टेबल पर टोकन मिलता है, तो हमें विश्वास है कि वे उपयोगकर्ता वही हैं जो वे हैं और उन्होंने अपने मेल में लिंक पर क्लिक किया। इस बिंदु पर अब हम पासवर्ड_रीसेट से उपयोगकर्ता का ईमेल लेते हैं (याद रखें कि हमने उनके ईमेल पते के साथ टोकन सहेजा था) तालिका और उस ईमेल का उपयोग उपयोगकर्ता को उपयोगकर्ता तालिका से प्राप्त करें और उनका पासवर्ड अपडेट करें।

आशा है कि यह काफी स्पष्ट है। यदि नहीं, तो बस इधर-उधर रहें और जैसे-जैसे हम इसे लागू करेंगे, यह स्पष्ट होता जाएगा।

कार्यान्वयन

Password_recovery नाम का एक डेटाबेस बनाएं और उस डेटाबेस में, दो टेबल बनाएं, जैसे कि उपयोगकर्ता और पासवर्ड_रीसेट निम्न फ़ील्ड के साथ:

उपयोगकर्ता:

+----+-----------+--------------+------------+
|     field      |     type     | specs      |
+----+-----------+--------------+------------+
|  id            | INT(11)      |            |
|  username      | VARCHAR(255) |            |
|  email         | VARCHAR(255) | UNIQUE     |
|  password      | VARCHAR(255) |            |
+----------------+--------------+------------+

पासवर्ड_रीसेट:

+----+-----------+--------------+------------+
|     field      |     type     | specs      |
+----+-----------+--------------+------------+
|  id            | INT(11)      |            |
|  email         | VARCHAR(255) |            |
|  token         | VARCHAR(255) | UNIQUE     |
+----------------+--------------+------------+

नोट: इस एप्लिकेशन के लिए आवश्यक है कि उपयोगकर्ता पहले से ही सिस्टम पर पंजीकृत हो। लेकिन, हम इस ट्यूटोरियल में उपयोगकर्ता पंजीकरण भाग को कवर नहीं करेंगे क्योंकि यह इस साइट पर पहले ही कवर किया जा चुका है। आप पहले उस ट्यूटोरियल का अनुसरण कर सकते हैं (मैं आपको सलाह देता हूं) या नहीं, लेकिन ध्यान रखें कि हमें उनके पासवर्ड को रीसेट करने के लिए आगे बढ़ने से पहले डेटाबेस में हमारे उपयोगकर्ता तालिका में एक उपयोगकर्ता होना चाहिए। तो एक तरह से या दूसरे, एक उपयोगकर्ता को अपने MySQL डेटाबेस में जोड़ें। आप PHPMyAdmin जैसे टूल का उपयोग कर सकते हैं और सुनिश्चित करें कि आपने md5() का उपयोग करके पासवर्ड एन्क्रिप्ट किया है।

अब पासवर्ड-रिकवरी नामक एक प्रोजेक्ट फ़ोल्डर बनाएं और सुनिश्चित करें कि यह फ़ोल्डर आपकी सर्वर निर्देशिका (htdocs फ़ोल्डर या www फ़ोल्डर) में है। उस फोल्डर में तीन फाइलें बनाएं, जैसे:login.php, enter_email.php, new_pass.php:

इन तीन फाइलों में से प्रत्येक उन तीन चरणों का प्रतिनिधित्व करती है जिन्हें हमने पहले उल्लिखित किया था। उनमें से प्रत्येक को खोलें और उनमें निम्नलिखित कोड पेस्ट करें:

login.php:

<?php include('app_logic.php'); ?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Password Reset PHP</title>
	<link rel="stylesheet" href="main.css">
</head>
<body>
	<form class="login-form" action="login.php" method="post">
		<h2 class="form-title">Login</h2>
		<!-- form validation messages -->
		<?php include('messages.php'); ?>
		<div class="form-group">
			<label>Username or Email</label>
			<input type="text" value="<?php echo $user_id; ?>" name="user_id">
		</div>
		<div class="form-group">
			<label>Password</label>
			<input type="password" name="password">
		</div>
		<div class="form-group">
			<button type="submit" name="login_user" class="login-btn">Login</button>
		</div>
		<p><a href="enter_email.php">Forgot your password?</a></p>
	</form>
</body>
</html>

Enter_email.php:

<?php include('app_logic.php'); ?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Password Reset PHP</title>
	<link rel="stylesheet" href="main.css">
</head>
<body>
	<form class="login-form" action="enter_email.php" method="post">
		<h2 class="form-title">Reset password</h2>
		<!-- form validation messages -->
		<?php include('messages.php'); ?>
		<div class="form-group">
			<label>Your email address</label>
			<input type="email" name="email">
		</div>
		<div class="form-group">
			<button type="submit" name="reset-password" class="login-btn">Submit</button>
		</div>
	</form>
</body>
</html>

new_pass.php:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Password Reset PHP</title>
	<link rel="stylesheet" href="main.css">
</head>
<body>
	<form class="login-form" action="new_password.php" method="post">
		<h2 class="form-title">New password</h2>
		<!-- form validation messages -->
		<?php include('messages.php'); ?>
		<div class="form-group">
			<label>New password</label>
			<input type="password" name="new_pass">
		</div>
		<div class="form-group">
			<label>Confirm new password</label>
			<input type="password" name="new_pass_c">
		</div>
		<div class="form-group">
			<button type="submit" name="new_password" class="login-btn">Submit</button>
		</div>
	</form>
</body>
</html>

इनमें से प्रत्येक फ़ाइल में, आप देखते हैं कि हम तीन फ़ाइलें शामिल कर रहे हैं जिन्हें हमने अभी तक नहीं बनाया है, अर्थात् app_logic.php ,Messages.php,file और main.css। पहला हमारे एप्लिकेशन के सभी तर्कों को संभालता है जैसे कि डेटाबेस को क्वेरी करना, उपयोगकर्ता को ईमेल भेजना और बहुत कुछ; दूसरा उपयोगकर्ता को फीडबैक संदेश प्रदर्शित करता है जैसे कि जब वे गलत ईमेल दर्ज करते हैं, तो तीसरा एप्लिकेशन की स्टाइलिंग है।

इन फाइलों को पासवर्ड-रिकवरी फोल्डर में बनाएं। main.css फ़ाइल में, यह स्टाइलिंग कोड जोड़ें:

main.css:

body {
	background: #3b5998;
	font-size: 1.1em;
	font-family: sans-serif;
}
a {
	text-decoration: none;
}
form {
	width: 25%;
	margin: 70px auto;
	background: white;
	padding: 10px;
	border-radius: 3px;
}
h2.form-title {
	text-align: center;
}
input {
	display: block;
	box-sizing: border-box;
	width: 100%;
	padding: 8px;
}
form .form-group {
	margin: 10px auto;
}
form button {
	width: 100%;
	border: none;
	color: white;
	background: #3b5998;
	padding: 15px;
	border-radius: 5px;
}
.msg {
	margin: 5px auto;
	border-radius: 5px;
	border: 1px solid red;
	background: pink;
	text-align: left;
	color: brown;
	padding: 10px;
}

app_logic.php:

<?php 

session_start();
$errors = [];
$user_id = "";
// connect to database
$db = mysqli_connect('localhost', 'root', '', 'password-reset-php');

// LOG USER IN
if (isset($_POST['login_user'])) {
  // Get username and password from login form
  $user_id = mysqli_real_escape_string($db, $_POST['user_id']);
  $password = mysqli_real_escape_string($db, $_POST['password']);
  // validate form
  if (empty($user_id)) array_push($errors, "Username or Email is required");
  if (empty($password)) array_push($errors, "Password is required");

  // if no error in form, log user in
  if (count($errors) == 0) {
    $password = md5($password);
    $sql = "SELECT * FROM users WHERE username='$user_id' OR email='$user_id' AND password='$password'";
    $results = mysqli_query($db, $sql);

    if (mysqli_num_rows($results) == 1) {
      $_SESSION['username'] = $user_id;
      $_SESSION['success'] = "You are now logged in";
      header('location: index.php');
    }else {
      array_push($errors, "Wrong credentials");
    }
  }
}

/*
  Accept email of user whose password is to be reset
  Send email to user to reset their password
*/
if (isset($_POST['reset-password'])) {
  $email = mysqli_real_escape_string($db, $_POST['email']);
  // ensure that the user exists on our system
  $query = "SELECT email FROM users WHERE email='$email'";
  $results = mysqli_query($db, $query);

  if (empty($email)) {
    array_push($errors, "Your email is required");
  }else if(mysqli_num_rows($results) <= 0) {
    array_push($errors, "Sorry, no user exists on our system with that email");
  }
  // generate a unique random token of length 100
  $token = bin2hex(random_bytes(50));

  if (count($errors) == 0) {
    // store token in the password-reset database table against the user's email
    $sql = "INSERT INTO password_reset(email, token) VALUES ('$email', '$token')";
    $results = mysqli_query($db, $sql);

    // Send email to user with the token in a link they can click on
    $to = $email;
    $subject = "Reset your password on examplesite.com";
    $msg = "Hi there, click on this <a href=\"new_password.php?token=" . $token . "\">link</a> to reset your password on our site";
    $msg = wordwrap($msg,70);
    $headers = "From: [email protected]";
    mail($to, $subject, $msg, $headers);
    header('location: pending.php?email=' . $email);
  }
}

// ENTER A NEW PASSWORD
if (isset($_POST['new_password'])) {
  $new_pass = mysqli_real_escape_string($db, $_POST['new_pass']);
  $new_pass_c = mysqli_real_escape_string($db, $_POST['new_pass_c']);

  // Grab to token that came from the email link
  $token = $_SESSION['token'];
  if (empty($new_pass) || empty($new_pass_c)) array_push($errors, "Password is required");
  if ($new_pass !== $new_pass_c) array_push($errors, "Password do not match");
  if (count($errors) == 0) {
    // select email address of user from the password_reset table 
    $sql = "SELECT email FROM password_reset WHERE token='$token' LIMIT 1";
    $results = mysqli_query($db, $sql);
    $email = mysqli_fetch_assoc($results)['email'];

    if ($email) {
      $new_pass = md5($new_pass);
      $sql = "UPDATE users SET password='$new_pass' WHERE email='$email'";
      $results = mysqli_query($db, $sql);
      header('location: index.php');
    }
  }
}
?>

यहां आपको if स्टेटमेंट के तीन ब्लॉक दिखाई देते हैं। ये कथन तीन क्रियाओं को संभालते हैं, जैसे उपयोगकर्ता लॉगिन, रीसेट ईमेल प्राप्त करना और नया पासवर्ड प्राप्त करना। दूसरे ब्लॉक में, उपयोगकर्ता ईमेल पता प्राप्त करने के बाद, उपयोगकर्ता को एक लंबित.php पृष्ठ पर पुनर्निर्देशित किया जा रहा है। यह पृष्ठ केवल एक संदेश प्रदर्शित करता है जो उपयोगकर्ता को बताता है कि उनके ईमेल पते पर एक ईमेल भेजा गया है जिसका उपयोग वे अपना पासवर्ड रीसेट करने के लिए कर सकते हैं।

हमारे प्रोजेक्ट के रूट फोल्डर में पेंडिंग.php बनाएं और इस कोड को इसके अंदर जोड़ें:

लंबित.php:

<?php include('app_logic.php'); ?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Password Reset PHP</title>
	<link rel="stylesheet" href="main.css">
</head>
<body>

	<form class="login-form" action="login.php" method="post" style="text-align: center;">
		<p>
			We sent an email to  <b><?php echo $_GET['email'] ?></b> to help you recover your account. 
		</p>
	    <p>Please login into your email account and click on the link we sent to reset your password</p>
	</form>
		
</body>
</html>

Messages.php एक फ़ाइल है जो प्रपत्र पर त्रुटि संदेश प्रदर्शित करने के लिए कोड स्निपेट रखती है। इसे खोलें और इस कोड को इसके अंदर पेस्ट करें:

संदेश.php:

<?php  if (count($errors) > 0) : ?>
  <div class="msg">
  	<?php foreach ($errors as $error) : ?>
  	  <span><?php echo $error ?></span>
  	<?php endforeach ?>
  </div>
<?php  endif ?>

अब इस प्रोजेक्ट को अपने ब्राउज़र पर http://localhost/password-recovery/login.php पर खोलें और इसके साथ खेलें।

नोट: हमने उपयोगकर्ता को ईमेल भेजने के लिए PHP के मेल () फ़ंक्शन का उपयोग किया। यह फ़ंक्शन लोकलहोस्ट से मेल नहीं भेज सकता है। यह केवल इंटरनेट पर होस्ट किए गए सर्वर का उपयोग करके ऐसा कर सकता है। हालांकि यदि आप अपने स्थानीय सिस्टम पर एक डेमो दिखाना चाहते हैं तो हम ईमेल भेजने के अनुकरण के लिए एक परीक्षण मेल एप्लिकेशन का उपयोग कर सकते हैं।

निष्कर्ष

इस ट्यूटोरियल को अंत तक फॉलो करने के लिए धन्यवाद। मुझे उम्मीद है कि स्पष्टीकरण काफी स्पष्ट था और आपने कुछ ऐसा सीखा जो आपके वेब विकास में आपकी मदद कर सकता है। अगर आपको कोई समस्या या चिंता है, तो उन्हें नीचे टिप्पणी में देना न भूलें और मैं आपसे संपर्क करूंगा।

आपका दिन शुभ हो!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_ARRAYAGG () - MySQL में एक क्वेरी की पंक्तियों से एक JSON सरणी बनाएं

  2. ClusterControl 1.7.2 की घोषणा:TimescaleDB और MySQL 8.0 के लिए बेहतर पोस्टग्रेएसक्यूएल बैकअप और समर्थन

  3. ClusterControl 1.4.1 की घोषणा - ProxySQL संस्करण

  4. पीडीओ का उपयोग करके सहायक फ़ंक्शन डालें/अपडेट करें

  5. डेटाबेस सेटअप करें और AWS Redshift और Mysql में केवल-पढ़ने के लिए उपयोगकर्ता बनाएं