Para la mayoría de los inicios de sesión automáticos que conozco, existe una tabla separada para almacenar las sesiones registradas. A cada sesión de inicio de sesión automático se le asigna una clave hash como identificador, la clave es considerablemente larga y prácticamente imposible de falsificar. Si no desea que los usuarios inicien sesión en cross-ip, incluso con un código válido, intente esto.
function gen_uniqueIdent($length=32){
$alphabet = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789');
$key = '';
for($loop=0;$loop<$length;$loop++){
$i = mt_rand(0,count($alphabet)-1);
$key.= $alphabet[$i];
}
return $key;
}
Asigne este valor a la cookie de usuario al iniciar sesión. A continuación, almacenar esto en el PP:
function save_ident($identFromFunctionAbove,$authenticated_user_id){
//hash this with something unique to the user's machine
$hashed = md5($identFromFunctionAbove . $_SERVER['REMOTE_ADDR']);
/** Some actions to remember this hash **/
}
salvo que en una base de datos correspinding con una identidad de usuario como user_id.
Ahora tras la validación de la cookie de usuario, puede simplemente:
function validateCookie(){
$ident = $_COOKIE['yourCookieName'];
$hashed = md5($ident . $_SERVER['REMOTE_ADDR']);
/** Check if this hashed value exists in db, if it does, authenticate user **/
}
Usted también necesitará para eliminar las sesiones después de su vencimiento o el usuario inicia sesión explícitamente.
Por supuesto, esto es muy simple y no tiene en cuenta las colisiones md5 o ident. Aún así, conseguir que dos cadenas generadas al azar de 32 caracteres sean las mismas que las generadas previamente es una posibilidad bastante pequeña.
"Cuando un usuario visita su sitio web, puede verificar el valor de esa cookie y obtener el usuario al que pertenece e iniciar sesión" ¿Cuál es la mejor manera de hacerlo? ¿Simplemente redirigirlos a la página segura con su usuario/pase del db? – CodeCrack
@CodeCrack Usted tiene control total sobre si un usuario está autenticado o no, por lo que realmente no existe la mejor manera. Simplemente haga lo mismo que haría después de que ingresaron su nombre de usuario/contraseña. Probablemente tenga (o pueda crear) una función o algo llamado 'complete_login()' que los datos necesarios para la sesión. –
¿Cuál es el beneficio de destruir el antiguo token al iniciar sesión? Supongo que se pasará uno nuevo al cliente en ese momento también, ¿no es así? – Uwe