PX : code

http authentication logoff by Auke van Slooten
Download this code


<?php
  
// this is the logoff script which will simply set the
  // loggedon variable of the user to 0.
  // This will cause the next password check of the user
  // to fail.
  // the previous script will then send the Deny message, with
  // a $realm which contains a timestamp. This means that the
  // browser will get a realm which it doesn't know. Therefor, it
  // will not have any default user login/password to go with it.
  // this prevents IE4,5 from trying it once again, without user 
  // intervention or displaying the login/password in the login
  // window.
  // 
  // The authentication routine for this script is the same
  // as for any other page you wish to protect.
  
class puser {

  function 
CheckPassword($password) {

    if (!
$this->loggedon) {
      
// fail once for users who have logged off.
      // I've used a timestamp here, so you could also
      // decide that users should login again after a
      // a certain amount of time.
      
$this->loggedon=time();
      
$this->save();
    } else {
      
$password=crypt($passwordsubstr($this->password02));
    }
    return 
$password==$this->password
  }

  function 
save() {
    
// save user data somewhere, preferable a database
    // this includes login, password and loggedon 

    // ... fill in

  
}

}

function 
Deny($realm$accesdenied) {
  
Header("WWW-Authenticate: Basic Realm=\"".$realm."\"");
  
Header("HTTP/1.0 401 Unauthorized");
  echo 
$accessdenied;
  return 
0;
}

function 
GetUser($login) {
  
// find the user data and instantiate a user 
  // object if found.

  // ... fill in

  
if ($login_found) {
    
$user=new user;
    
$user->login=$login;  
    
$user->loggedon=$loggedon;
    
$user->password=$password;
  }
  return 
$user;
}

// important! the timestamp in the realm is the trick
// to a reliable logoff. 
$realm="A Realm (".strftime("%c",time()).")";
$accesdenied="<html><body bgcolor=\"white\"><h1>".
             
"Access Denied</h1></body></html>";

if (!
$PHP_AUTH_USER) {
  
// no authentication data -> deny access.
  
Deny($realm$accesdenied);
} else {
  
$user=GetUser($PHP_AUTH_USER);
  if (
$user && $user->CheckPassword($PHP_AUTH_PW)) {
    
// the user is in, display your page here. 
    // or in this case, as it is the logoff page:
    
$user->loggedon=0;
    
$user->save();
?>
<html>
<body>
  <h3>Goodbye <?php echo $user->login?>, come back soon.</h3>
</body>
</html>
<?php
  
} else {
    
Deny($realm$accesdenied);
  }
}

?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.