Creating a Secure Login System: Best Practices and Implementation Guide

Creating a Secure Login System

আজকের ডিজিটাল যুগে, যেখানে ব্যক্তিগত তথ্য ক্রমাগত হ্যাক এবং চুরি হওয়ার ঝুঁকিতে রয়েছে, একটি secure login system যেকোনো ওয়েব অ্যাপ্লিকেশন বা অনলাইন সার্ভিসের জন্য একটি অপরিহার্য উপাদান। আপনি একটি ছোট ব্লগ, একটি শক্তিশালী ই-কমার্স প্ল্যাটফর্ম, বা একটি জটিল এন্টারপ্রাইজ সিস্টেম তৈরি সহ যাই করেন না কেন, user login credentials এর নিরাপত্তা নিশ্চিত করা সবচেয়ে গুরুত্বপূর্ণ। সাইবার হুমকি বাড়ছে এবং হ্যাকাররা ক্রমবর্ধমান শক্তিশালী হয়ে উঠছে, একটি শক্তিশালী এবং সুরক্ষিত লগইন সিস্টেম প্রয়োগ করে যেকোনো ঝুঁকি থেকে এগিয়ে থাকা অত্যন্ত গুরুত্বপূর্ণ।

এই আর্টিকেলটি একটি secure login system তৈরি করার জন্য একটি ব্যাপক গাইড হিসাবে কাজ করবে, এখানে আমি সর্বোত্তম প্র্যাক্টিস গুলো , প্রয়োজনীয় ফীচার এবং প্রাকটিক্যাল ইম্প্লিমেন্টেশনের ধাপগুলির গভীরভাবে প্রয়োগের চেষ্টা করব । এই গাইডের শেষে, আপনি আপনার ইউজারদের অ্যাকাউন্ট এবং গোপনীয় ডেটা কার্যকরভাবে সুরক্ষিত করার জন্য প্রয়োজনীয় জ্ঞান এবং টুলগুলির সাথে পরিচিত হবেন।

আসুন আপনার ওয়েব অ্যাপ্লিকেশনের ডিফেন্সকে শক্তিশালী করার জন্য একটি পথ চলা শুরু করি এবং একটি লগইন সিস্টেম তৈরি করি যা ব্যবহারযোগ্যতা বা কর্মক্ষমতা ত্যাগ না করে নিরাপত্তাকে অগ্রাধিকার দেয়।

Usage Table Structure

এখানে আমরা আমাদের Secure Registration System তৈরির জন্য যে টেবিল তৈরি করেছি , সেটিই ব্যবহার করব। এবং সেই Registration Form দিয়ে রেজিস্টার্ড ইউজারদের কে লগিনের ব্যবস্থা করব। এবং সেই সাথে নতুন করে নিম্নোক্ত remember_me_tokens টেবিলটি তৈরি করব :

1
2
3
4
CREATE TABLE `remember_me_tokens` (
  `email` varchar(255) NOT NULL,
  `token` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Create db_connection.php File To Configure Connect Database

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
// Replace the following values with your actual database credentials
$hostname = 'localhost';
$username = 'WRITE_YOUR_DATABASE_USERNAME';
$password = 'WRITE_YOUR_DATABASE_PASSWORD';
$database = 'WRITE_YOUR_DATABASE_NAME';
 
try {
    $db = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

এই PHP code টি PDO (PHP Data Objects) extension ব্যবহার করে একটি মাইএসকিউএল ডাটাবেসের সাথে একটি সংযোগ স্থাপন করে। এবং সঠিক exception handling সহ database-related errors গুলি পরিচালনা করে।

Create Auth Class for Handling Login Functionality

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<?php
class Auth {
    private $db;
    private $sessionLifetime;
  
    public function __construct($db) {
        session_start();
        $this->db = $db;
    }
  
    public static function generateCSRFToken() {
        // Generate a random CSRF token
        $csrfToken = bin2hex(random_bytes(32)); // A 64-character token (you can adjust the length if needed)
  
        // Store the CSRF token in the user's session
          $_SESSION['csrf_token'] = $csrfToken;
  
        return $csrfToken;
    }
  
    public function login($email, $password, $rememberMe = false) {
        // Check if the email exists in the database
        if ($user = $this->getUserByEmail($email)) {
            // Verify the password using password_verify
            if (password_verify($password, $user['password']) && $user['verified']===1) {
                // Password is correct
                session_regenerate_id(true); // Regenerate the session ID for security
      
                // Set user data in the session
                $_SESSION['user_id'] = $user['user_id'];
                $_SESSION['user_name'] = $user['name'];
                      
                // Set a long-lived cookie for "Remember Me" if requested
                if ($rememberMe) {
                    $this->setRememberMeCookie($email);
                }
      
                return true; // Login successful
            }
        }
      
        return false; // Invalid email or password
    }
      
    private function setRememberMeCookie($email) {
        // Generate a unique token for the "Remember Me" functionality
        $token = bin2hex(random_bytes(32)); // A 64-character token
      
        // Hash the token before storing it in the database
        $hashedToken = password_hash($token, PASSWORD_BCRYPT);
 
        // Store the token in the database, associated with the user's email
        if ($this->storeRememberMeToken($email, $hashedToken)) {
            // Set a long-lived session cookie with the token
            $cookie_name = "remember_me_token";
            $cookie_value = $token;
            $expiration = time() + 30 * 24 * 60 * 60; // 30 days
      
            setcookie($cookie_name, $cookie_value, $expiration, '/');
        }
    }
  
    public function getUserByEmail($email) {
        // Get user data from the database based on email
        $query = "SELECT user_id, name, verified, password FROM users WHERE email = :email";
      
        $stmt = $this->db->prepare($query);
      
        if ($stmt) {
            $stmt->bindParam(':email', $email, PDO::PARAM_STR);
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            $stmt->closeCursor();
      
            if ($result) {
                return $result;
            }
        }
      
        return null; // No user found or database error
    }
  
    public function logout() {
            // Unset and destroy the user's session data
            $_SESSION = array();
            session_unset();
            session_destroy();
             
             // Delete the remember_me_token cookie
            setcookie('remember_me_token', '', time() - 3600, "/");
            // Regenerate the session ID to prevent session fixation attacks
            session_start();
            session_regenerate_id(true);
    }
      
    private function storeRememberMeToken($email, $token) {
        // Store the token in the database, associated with the user's email
        $query = "INSERT INTO remember_me_tokens (email, token) VALUES (:email, :token)";
      
        $stmt = $this->db->prepare($query);
      
        if ($stmt) {
            $stmt->bindParam(':email', $email, PDO::PARAM_STR);
            $stmt->bindParam(':token', $token, PDO::PARAM_STR);
      
            if ($stmt->execute()) {
                return true; // Token stored successfully
            }
        }
      
        return false; // Token storage failed
    }
 
    public function checkRememberMe()
    {
        if (isset($_COOKIE['remember_me_token'])) {
            $token = $_COOKIE['remember_me_token'];
            $user = $this->getUserByToken($token);
 
            if ($user) {
                // Valid token, log in the user
                session_regenerate_id(true);
 
                $_SESSION['user_id'] = $user['user_id'];
                $_SESSION['user_name'] = $user['name'];
 
                return true;
            } else {
                // Invalid token, log out the user
                $this->logout();
                return false;
            }
        }
 
        return false;
    }
 
    private function getUserByToken($token)
    {
        $query = "SELECT u.user_id, u.name FROM users u
                  JOIN remember_me_tokens r ON u.email = r.email
                  WHERE r.token = :token";
        $stmt = $this->db->prepare($query);
 
        if ($stmt) {
            $stmt->bindParam(":token", $token, PDO::PARAM_STR);
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            $stmt->closeCursor();
 
            if ($result) {
                return $result;
            }
        }
 
        return null;
    }
 
    public function isLoggedIn()
{
        $this->sessionLifetime = 1800; // Set session lifetime to 30 minutes
 
        if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $this->sessionLifetime)) {
            // Session has expired
            $this->logout();  // Log the user out automatically
            return false;
        }
 
        if (isset($_SESSION['user_id'])) {
            // Update last activity timestamp only if the user is logged in
            $_SESSION['last_activity'] = time();
 
            // Check if the user is valid based on the database
            return $this->isValidSession();
        }
        return false;
}
 
    private function isValidSession()
    {
        $user_id = $_SESSION['user_id'];
 
        $query = "SELECT user_id, name FROM users WHERE user_id = :user_id";
        $stmt = $this->db->prepare($query);
 
        if ($stmt) {
            $stmt->bindParam(":user_id", $user_id, PDO::PARAM_INT);
            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            $stmt->closeCursor();
 
            return ($result !== false); // Check if the user exists in the database
        }
 
        return false;
    }
}

এই PHP Auth class ইউজারদের authentication ফাঙ্কশনালিটি প্রদান করে, যার মধ্যে login, logout, CSRF টোকেন তৈরি এবং সংরক্ষণ করা এবং “Remember Me” ফাঙ্কশনালিটি হ্যান্ডেল করে । এখানে key method গুলো এবং ফীচার গুলির একটি সংক্ষিপ্ত বিবরণ রয়েছে:

  • ১.Constructor (__construct):
    ইউজারের সেশন শুরু করে এবং database connection ($db) সেট করে।
  • ২. generateCSRFToken:
    একটি random CSRF টোকেন তৈরি করে এবং এটি ইউজারের সেশনে সংরক্ষণ করে।
  • ৩. login:
    • ডাটাবেসের মধ্যে user credentials (email এবং password) যাচাই করে।
    • successful login করার পরে সেশনে ইউজারের ডেটা সেট করে।
    • এছাড়াও, এটি “Memember Me” ফাঙ্কশনালিটির জন্য একটি দীর্ঘস্থায়ী cookie সেট করে।
  • ৪. setRememberMeCookie:
    • “Remember Me.” এর জন্য একটি unique token তৈরি করে।
    • ইউজারের ইমেলের সাথে যুক্ত ডাটাবেসে টোকেন সংরক্ষণ করে।
    • “Remember Me” এর টোকেন সহ একটি দীর্ঘস্থায়ী সেশন কুকি সেট করে।
  • ৫. getUserByEmail:
    • প্রদত্ত ইমেলের উপর ভিত্তি করে ডাটাবেস থেকে ইউজারের ডেটা বের করে।
  • ৬. logout:
    • logout করার সময় ইউজারের সেশন ডেটা Unset এবং destroy করে।
    • নিরাপত্তার জন্য session ID Regenerate করে।
  • ৭. isAuthenticated:
    • session এবং session lifetime এ ইউজারের ডেটার উপস্থিতির উপর ভিত্তি করে একজন ইউজার authenticated কিনা তা পরীক্ষা করে।
    • session’s expiration হওয়া ম্যানেজ করতে “last_activity” timestamp আপডেট করে।
  • ৮. rememberMe:
    • “Remember Me” এর জন্য একটি unique token জেনারেট করে।
    • ইউজারের ইমেলের সাথে যুক্ত ডাটাবেসে টোকেন সংরক্ষণ করে।
    • “Remember Me” এর টোকেন সহ একটি দীর্ঘস্থায়ী সেশন কুকি সেট করে।
  • ৯. storeRememberMeToken:
    • ইউজারের ইমেলের সাথে যুক্ত ডাটাবেসে “Remember Me” টোকেন সংরক্ষণ করে।

এই ক্লাসটি আপনার PHP অ্যাপ্লিকেশনে user authentication, session management, CSRF token generation এবং “Remember Me” ফাঙ্কশনালিটি পরিচালনা করার জন্য একটি নিরাপদ এবং সংগঠিত উপায় প্রদান করে।

Create a Secure Login Form

login.php

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
include("Auth.php");
include("db_connection.php");
$userAuth = new Auth($db); // Create an instance of the UserAuthentication class
// Check if the user is authenticated
if ($userAuth->isLoggedIn()) {
    // User is authenticated, redirect to the dashboard page
    header("Location: dashboard.php");
    exit();
}
$csrfToken = Auth::generateCSRFToken();
?>
<!DOCTYPE html>
<html>
<head>
    <title>Login Form</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
</head>
<body>
    <div class="container mt-5">
        <div class="row justify-content-center">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Login</div>
                    <div class="card-body">
                        <form id="login-form">
                            <!-- Add a hidden input field for the CSRF token -->
                            <input type="hidden" name="csrf_token" id="csrf_token" value="<?php echo $csrfToken; ?>">
 
                            <div class="form-group">
                                <label for="email">Email:</label>
                                <input type="text" class="form-control" id="email" name="email">
                            </div>
                            <div class="form-group">
                                <label for="password">Password:</label>
                                <div class="input-group">
                                    <input type="password" class="form-control" id="password" name="password">
                                    <div class="input-group-append">
                                        <button class="btn btn-outline-secondary" type="button" id="toggle-password">
                                            <i class="far fa-eye"></i>
                                        </button>
                                    </div>
                                </div>
                            </div>
                            <div class="form-group form-check">
                                <input type="checkbox" class="form-check-input" id="rememberMe" name="rememberMe">
                                <label class="form-check-label" for="rememberMe">Remember Me</label>
                            </div>
                            <button type="submit" class="btn btn-primary btn-block">Login</button>
                        </form>
                        <div class="text-center mt-3">
                            <a href="forgot_password.html">Forgot Password?</a>
                        </div>
                    </div>
                    <div class="alert" id="login-alert" style="display: none;"></div> <!-- Add this alert element -->
                </div>
            </div>
        </div>
    </div>
 
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="loginscripts.js"></script>
</body>
</html>

উপরের কোডটিতে আমরা PHP এবং HTML এর সমন্বয়ে একটি login form তৈরি করেছি। এতে নিরাপত্তার জন্য একটি CSRF (Cross-Site Request Forgery) টোকেন রয়েছে, যা যা ইউজারদের তাদের ইমেল এবং পাসওয়ার্ড দিয়ে লগ ইন করতে দেয়। ফর্মটিতে “Remember Me” অপশন এবং password Field এর জন্য একটি Password visibility toggle ও অন্তর্ভুক্ত রয়েছে।

Output:

Secure Login Feature

Create scripts.js File for Validation and Sending and Receiving Server Requests

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
$(document).ready(function() {
    $("#login-form").submit(function(event) {
        event.preventDefault();
        var csrf_token= $("#csrf_token").val();
        var email = $("#email").val();
        var password = $("#password").val();
        var rememberMe = $("#rememberMe").is(":checked");
 
        // Create a data object to store the values to be sent to the server
        var requestData = {
            email: email,
            password: password,
            csrf_token: csrf_token
        };
 
        // Only add the "rememberMe" parameter to the data object if the checkbox is checked
        if (rememberMe) {
            requestData.rememberMe = true;
        }
 
        $.ajax({
            type: "POST",
            url: "loginProcess.php", // Create this file to handle the login logic
            data: JSON.stringify(requestData),
            contentType: 'application/json',
            dataType: 'json',
            success: function(response) {
                if (response.success) {
                    // Redirect to a success page or perform other actions
                    window.location.href = "dashboard.php";
                } else {
                    // Display a generic error message to users
                    $('#login-alert').removeClass('alert-success').addClass('alert-danger');
                    $('#login-alert').text("Login failed. Please check your credentials.").show();
                }
            },
            error: function(xhr, status, error) {
                // Log detailed error information on the server
                console.error(xhr.responseText);
                // Display a generic error message to users
                $('#login-alert').removeClass('alert-success').addClass('alert-danger');
                $('#login-alert').text("An error occurred during login.").show();
            }
        });
    });
 
 
    // Toggle password visibility
    $('#toggle-password').on('click', function () {
        var passwordInput = $('#password');
        var passwordFieldType = passwordInput.attr('type');
 
        if (passwordFieldType === 'password') {
            passwordInput.attr('type', 'text');
            $('#toggle-password i').removeClass('far fa-eye').addClass('far fa-eye-slash');
        } else {
            passwordInput.attr('type', 'password');
            $('#toggle-password i').removeClass('far fa-eye-slash').addClass('far fa-eye');
        }
    });
});

এই জাভাস্ক্রিপ্ট কোডটি একটি লগইন ফর্মের জন্য ডিজাইন করা হয়েছে এবং নিম্নলিখিত ফাঙ্কশনালিটি প্রদান করে:

  • ১. ($(document).ready(function() {…}) এটি যেকোন কোড টি যেকোনো কিছু এক্সেকিউট করার আগে document টি সম্পূর্ণরূপে loaded এবং ready হওয়ার জন্য অপেক্ষা করে।
  • ২. ইউজার যখন login form ($(“#login-form”).submit(…) সাবমিট করে , তখন (event.preventDefault();) টি AJAX ব্যবহার করে সাবমিশনটি হ্যান্ডেল করতে default form submission behavior প্রতিরোধ করে।
  • ৩. এটি ফর্ম থেকে email, password এবং “Remember Me” চেকবক্সের জন্য ব্যবহারকারীর ইনপুট বের করে৷
  • ৪. এটি ইউজারের login credentials এবং ডেটা হিসাবে CSRF টোকেন সহ সার্ভার-সাইড পিএইচপি স্ক্রিপ্টে (loginProcess.php) এ একটি AJAX POST রিকোয়েস্ট পাঠায়। এই পিএইচপি স্ক্রিপ্টটি লগইন লজিক গুলো হ্যান্ডেল করে এবং একটি success বা error message গুলো রেসপন্স জানাতে পারে ।
  • ৫. সার্ভার থেকে প্রাপ্ত response এর উপর নির্ভর করে, লগইন সফল হলে এটি ইউজারকে একটি success page (dashboard.php) পাঠায়। অথবা যদি কোনও error থাকে তবে একটি alert (#login-alert) এ একটি error message প্রদর্শন করে৷
  • ৬. এছাড়াও , কোডটি password input field এর visibility toggling করার সুযোগ দেয় যখন একজন ইউজার “eye” আইকনে (#toggle-password) ক্লিক করেন। এই ফাঙ্কশনালিটি ইউজারদের সুবিধার জন্য তাদের entered password view বা hide রাখার সুযোগ দেয়।

সামগ্রিকভাবে, এই কোডটি default form submission প্রতিরোধ করে, AJAX-এর সাথে অ্যাসিঙ্ক্রোনাসভাবে লগইন রিকোয়েস্ট পরিচালনা করে এবং একটি password visibility toggle feature প্রদান করে একটি লগইন ফর্মের নিরাপত্তা এবং ইউজারের অভিজ্ঞতা বাড়ায়।

Create loginProcess.php File to Communicate with Frontend AJAX and Auth Class

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
require 'Auth.php';
require'db_connection.php';
 
// Establish a database connection here
 
// Initialize the Auth class
$userAuth = new Auth($db);
 
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Validate the CSRF token
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        echo 'CSRF token validation failed.';
        exit;
    }
 
    $email = htmlspecialchars($_POST['email']);
    $password = $_POST['password'];
    $rememberMe = isset($_POST['rememberMe']);
 
    if ($userAuth->login($email, $password, $rememberMe)) {
        // Login successful
        echo 'success';
    } else {
        // Login failed with a specific reason
        if (!$userAuth->getUserByEmail($email)) {
            echo 'error: User not found';
        } elseif (!password_verify($password, $userAuth->getUserByEmail($email)['password'])) {
            echo 'error: Incorrect password';
        }
        elseif ($userAuth->getUserByEmail($email)['verified']===0) {
            echo 'error: Please verify your email first!';
        }
        else {
            echo 'error: Unknown error';
        }
    }
} else {
    echo 'Invalid request';
}
?>

এই পিএইচপি কোডটি একটি স্ক্রিপ্ট যা user login এবং authentication পরিচালনা করে। এটি Auth ক্লাস ব্যবহার করে এবং নিম্নলিখিত অ্যাকশন গুলি সম্পাদন করে:

  • ১. Including Required Files:
    • Auth.php এবং db_connection.php ফাইলগুলিকে Auth ক্লাসে অ্যাক্সেস করতে এবং একটি ডাটাবেস সংযোগ স্থাপন করতে এটি অন্তর্ভুক্ত করে।
  • ২. Database Connection:
    • এখানে db_connection.php ফাইলে একটি ডাটাবেস কানেকশন ($db) established হয়েছে।
  • ৩. User Authentication Initialization:
    • user authentication এবং লগইন ফাঙ্কশনালিটি পরিচালনা করার জন্য Auth ক্লাসের একটি ইনস্ট্যান্স তৈরি করা হয়েছে।
  • ৪. POST Request Handling:
    • incoming HTTP request method টি POST কিনা তা পরীক্ষা করে, যা সাধারণত ফর্ম submit দেওয়ার জন্য ব্যবহৃত হয়।
  • ৫. CSRF Token Validation:
    • এটি ফর্মে জমা দেওয়া ($_POST[‘csrf_token’]) মানটিকে ইউজারের সেশনে সংরক্ষিত মানের ($_SESSION[‘csrf_token’]) সাথে তুলনা করে CSRF টোকেনকে যাচাই করে।
    • যদি CSRF টোকেন validation ব্যর্থ হয়, এটি স্ক্রিপ্টটি বন্ধ করে দেয় এবং একটি error message আউটপুট করে।
  • ৬. Form Data Retrieval:
    • এটি form submission থেকে ইউজারের email, password এবং “Remember Me” checkbox value রিট্রিভ করে।
  • ৭. User Login Attempt:
    • এটি UserAuthentication ক্লাসের login method ব্যবহার করে ব্যবহারকারীকে লগ ইন করার চেষ্টা করে।
    • লগইন সফল হলে, এটি ‘success’ আউটপুট করে।
    • লগইন ব্যর্থ হলে, এটি ব্যর্থতার নির্দিষ্ট কারণ নির্ধারণের জন্য বিভিন্ন শর্ত চেক করে (যেমন, user not found, incorrect password, unverified email)।
    • এটি login failure এর একটি বিবরণ সহ একটি error message আউটপুট করে।
  • ৮. Handling Non-POST Requests:
    • request method টি POST না হলে, এটি ‘Invalid request’ আউটপুট করে।

Create Dashboard.php File

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
include("Auth.php");
include("db_connection.php");
 
// Create an instance of the Auth class
$userAuth = new Auth($db);
 
// Check if remember_me_token is present and valid
$userAuth->checkRememberMe();
 
// Check if the user is authenticated
if (!$userAuth->isLoggedIn()) {
    // User is not authenticated, redirect to the login page
    header("Location: login.php");
    exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dashboard</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-5">
        <div class="row justify-content-center">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Welcome to Your Dashboard</div>
                    <div class="card-body">
                        <h4>Hello, <?php echo $_SESSION['user_name']; ?>!</h4>
                        <p>You have successfully logged in to your dashboard.</p>
                        <a href="logout.php" class="btn btn-primary">Logout</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

এই PHP কোডে dashboard page এর জন্য user authentication প্রয়োগ করে। এখানে একটি সংক্ষিপ্ত বিবরণ দেওয়া হলো:

  • ১. Session Start:
    • কোডটি শুরু হয় session_start() দিয়ে একটি user session শুরু বা পুনরায় শুরু করতে।
  • ২. User Authentication Check:
    • user_id সেশন ভেরিয়েবল সেট করা আছে কিনা তা পরীক্ষা করে। এটি সেট না থাকলে, এর মানে ব্যবহারকারী লগ ইন করেননি।
  • ৩. Redirection to Login:
    • ব্যবহারকারী লগইন না করলে, এটি হেডার (‘অবস্থান: loginForm.php’) ফাংশন ব্যবহার করে ইউজারকে “loginForm.php” পৃষ্ঠায় রিডাইরেক্ট করে।
    • exit() ফাংশনটিকে রিডাইরেক্শন পরে স্ক্রিপ্ট এক্সিকিউশন বন্ধ করতে বলা হয়।
  • ৩. HTML Page:
    • বাকি কোডটি dashboard এর জন্য একটি HTML page, তবে এটি শুধুমাত্র প্রদর্শিত হয় যদি ইউজার authenticated হয়।
    • এটি একটি welcome message, ইউজারের নাম (সেশন থেকে বের করা) এবং একটি logout button সহ একটি সাধারণ ড্যাশবোর্ড দেখায়।
    • dashboard content একটি Bootstrap-styled card এ আবদ্ধ।

এই কোডটি নিশ্চিত করে যে শুধুমাত্র authenticated ইউজাররা dashboard এ অ্যাক্সেস করতে পারে। যদি একজন ইউজার লগইন না করে থাকে (কোন user_id সেশন ভেরিয়েবল না থাকে), তাহলে তাদেরকে authentication এর জন্য login page এ redirect করা হয়।

Secure Dashboard

Create logout.php File

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
require 'Auth.php';
require 'db_connection.php';
// Establish a database connection if required
 
// Initialize the UserAuthentication class
$userAuth = new Auth($db); // Pass your database connection
 
// Call the logout() method to log out the user
$userAuth->logout();
 
// Redirect to the login page or any other secure location
header('Location: loginForm.php'); // Change 'login.php' to the page you want to redirect to
exit();
?>

এই PHP কোডটি Auth ক্লাস থেকে logout() method কল করে ইউজার লগআউট এর কাজ সম্পন্ন করে, যা সাধারণত ইউজারের সেশন ডেটা unset করে এবং destroy করে। লগআউট করার পর, এটি ইউজারকে authentication এর জন্য “loginForm.php” পেজ redirect করে, স্ক্রিপ্ট এক্সিকিউশন বন্ধ করে।

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply