2016-06-10 4 views
1

Ich habe tausend Fragen über mein Problem gesucht und gefunden, ich habe versucht zu lösen, aber habe nicht geholfen. Also öffne ich diesen Thread für meinen speziellen Fall und ich hoffe du kannst mir helfen.Login-System mit Remember, wie?

Ich komme auf den Punkt, ich bin ein Login-System in PDO erstellen, sind ein Anfänger, aber ich wünschte, es würde sich über Cookies für eine Gesamtzeit einloggen.

Ich habe mehrere Tests, aber kein Ergebnis. Der Browser ist geschlossen, sie mussten erneut Anmeldeinformationen eingegeben werden.

Ich wiederhole, ich habe bereits auf der Website gesucht, aber nicht geschafft, zu lösen.

login.php

if (empty($_POST) === false) { 
    $username = trim($_POST['username']); 
    $password = trim($_POST['password']); 

    if (empty($username) === true || empty($password) === true) { 
     $errors[] = 'Sorry, but we need your username and password.'; 

    } else if ($users->user_exists($username) === false) { 
     $errors[] = 'Sorry that username doesn\'t exists.'; 

    } else if ($users->email_confirmed($username) === false) { 
     $errors[] = 'Sorry, but you need to activate your account. Please check your email.'; 

    } else { 

     $login = $users->login($username, $password); 

     if ($login === false) { 
      $errors[] = 'Sorry, that username/password is invalid';  
     } else { 
      $_SESSION['id'] = $login; // The user's id is now set into the user's session in the form of $_SESSION['id'] 
      $_SESSION['username'] = $usr; 

       $cookie_name = '_name_cookie_';   
       $hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 12]); // will result in a 32 characters hash 
       $cookie_time = (3600 * 24 * 30); // 30 days 
       setcookie($cookie_name, 'usr='.$usr.'&hash='.$hash, time() + $cookie_time);  


      header('Location: home.php'); 
      exit(); 
     } 
    } 
} 

Klasse: users.php

public function login($username, $password) { 
    $this->db->query("SELECT * FROM users WHERE username = :username"); 
    $this->db->bind(':username', $username); 
    $data = $this->db->single(); 

    $hash = $data['password']; 
    $id = $data['id']; 

    #hashing the supplied password and comparing it with the stored hashed password. 
    if (password_verify($password, $hash)) { 
     return $id; 
    }else{ 
     return false; 
    } 
} 

HINWEIS: in Form im Moment ist mir egal, Schach zu integrieren "Remember Me" , Ich werde es später machen.

Allerdings kann ich nicht wie eingeloggt Benutzer bleiben, der Cookie ist richtig eingefügt, aber sonst funktioniert es nicht. Wie repariere ich?

+0

rufen Sie session_start() am Anfang jeder Datei auf? Mein Login-System funktioniert genau so, wie Sie es wollen. Ich kann Ihnen zeigen, wie ich Sitzungen behandle, aber ich weiß nicht, ob das ist, was Sie wollen – JRsz

+0

Das ist nicht das Problem, session_start() wird auf jeder Seite aufgerufen, die Anmeldung wird dauern, jedoch begrenzt. Ich möchte Benutzerdaten aufzeichnen, damit ich nicht immer Ihre Daten eingeben muss. –

Antwort

0

Es gibt mehrere Ansätze, dies zu tun, einige besser als andere. Es gibt einige Informationen darüber, sogar auf dieser Website, aber ich werde die allgemeine Idee ausschöpfen.

Zunächst einmal benötigen Sie eine Art von Token oder etwas, um den Benutzer auf einer Client-Seite zu erkennen. Dies geschieht normalerweise unter Verwendung von $_COOKIE. Ich möchte zwei separate Cookies setzen, eines mit der Benutzer-ID und eines mit einem Hash-Token, so dass selbst dann, wenn jemand das Token erraten könnte (was sehr unwahrscheinlich ist), auch die entsprechende Benutzer-ID benötigt wird. Anhand von Beispielen aus dem Code, wäre dies Beispielcode die Cookies zu erzeugen

// Define variables 
define("COOKIE_DURATION", time()+60*60*24*30); // 30 days 
$userHash = hash("sha256", $_SESSION['id'].time()); 

// Set the cookies 
setcookie("RememberMeID", $_SESSION['id'], COOKIE_DURATION); 
setcookie("RememberMeHash", $userHash, COOKIE_DURATION); 

Dies verwendet die aktuelle Uhrzeit und den Benutzernamen kombiniert, dann Hash, so können wir es als Bezeichner verwenden. Ich habe sha256 dafür verwendet, da es kein Passwort ist, das wir speichern, sollte das in Ordnung sein.

Als nächstes müssen wir den Benutzer mit diesen beiden Cookies erkennen. Diese Daten müssen also auch auf dem Server gespeichert werden, damit wir sie vergleichen können, wenn der Benutzer die Website besucht. Sie können hierfür eine Datenbank verwenden, z. B. eine separate rememberMe Tabelle, die diese Informationen enthält. Dies könnte den zuvor erstellten Hash mit der Benutzer-ID enthalten. Sie müssen das also in die Datenbank einfügen.

$stmt = $pdo->prepare("INSERT INTO rememberMe (userID, userHash) VALUES (:id, :hash)"); 
$stmt->execute(array("id" => $_SESSION['id'], "hash" => $userHash)); 

Dann können Sie einfach überprüfen, ob beide Cookies gesetzt werden, während eine Sitzung nicht gesetzt ist, festzustellen, ob die Daten übereinstimmen - und wenn ja, stellen Sie ihre Sitzung!

// If we're not logged in, and the two cookies are set, we can check if something matches 
if (!isset($_SESSION['id']) && !empty($_COOKIE['RememberMeID']) && !empty($_COOKIE['RememberMeHash'])) { 
    // Check if the cookies match something in the DB... 
    $stmt = $pdo->prepare("SELECT COUNT(*) as `count`, userID FROM rememberMe WHERE userID=:id AND userHash=:hash"); 
    $stmt->execute(array("id" => $_COOKIE['RememberMeID'], "hash" => $_COOKIE['RememberMeHash'])); 
    $row = $stmt->fetch(PDO::FETCH_ASSOC); 

    // If it does, we log them in and renew the cookie 
    if ($row['count'] > 0) { 
     $_SESSION['id'] = $row['userID']; 
     setcookie("RememberMeID", $_SESSION['id'], COOKIE_DURATION); 
     setcookie("RememberMeHash", $_COOKIE['RememberMeHash'], COOKIE_DURATION); 
    } 
} 

Sie können auch eine Lese zu diesem Thema haben: What is the best way to implement "remember me" for a website?

+0

Vielen Dank für Ihre Antwort, ich habe einen neuen Kommentar mit einem Update gepostet. –

0

für Ihre Hilfe Sie so viel danken. Ich fortfahren zu der Zeit auf diese Weise:

if (empty($_POST) === false) { 
    $username = trim($_POST['username']); 
    $password = trim($_POST['password']); 

    if (empty($username) === true || empty($password) === true) { 
     $errors[] = 'Sorry, but we need your username and password.'; 

    } else if ($users->user_exists($username) === false) { 
     $errors[] = 'Sorry that username doesn\'t exists.'; 

    } else if ($users->email_confirmed($username) === false) { 
     $errors[] = 'Sorry, but you need to activate your account. Please check your email.'; 

    } else { 

     $login = $users->login($username, $password); 

     if ($login === false) { 
      $errors[] = 'Sorry, that username/password is invalid';  
     } else { 

      if (!isset($_SESSION['id']) && !empty($_COOKIE['RememberMeID']) && !empty($_COOKIE['RememberMeHash'])) { 
       $db->query("SELECT * FROM rememberMe WHERE userID = :userID AND userHash = :userHash"); 
       $db->bind(':userID', $_COOKIE['RememberMeID']); 
       $db->bind(':userHash', $_COOKIE['RememberMeHash']); 
       $db->resultset(); 
       $row = $db->rowCount(); 

       if ($row['count'] > 0) { 
        $_SESSION['id'] = $login; 
        setcookie("RememberMeID", $_SESSION['id'], COOKIE_DURATION); 
        setcookie("RememberMeHash", $_COOKIE['RememberMeHash'], COOKIE_DURATION); 
        header('Location: home.php'); 
        exit();  
       } 
      } 
     } 
    } 
} 

Während ich frage mich, wo den ersten Code einzugeben und zu welchem ​​Zeitpunkt.In der Tat muss der Code für das Einfügen des Token zum Beispiel in der Registrierungsseite eingefügt werden, so dass die Registrierung Benutzer in die Datenbank eingegeben werden?

Verwandte Themen