Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] validación de login

Estas en el tema de validación de login en el foro de Javascript en Foros del Web. Buenas, Soy nueva en el mundo del desarrollo web así que necesito vuestra ayuda. Tengo una página con un formulario de entrada en el que ...
  #1 (permalink)  
Antiguo 28/03/2013, 06:07
 
Fecha de Ingreso: marzo-2013
Mensajes: 4
Antigüedad: 11 años, 1 mes
Puntos: 0
validación de login

Buenas,

Soy nueva en el mundo del desarrollo web así que necesito vuestra ayuda. Tengo una página con un formulario de entrada en el que al submitirse se ejecuta una función javascript para validar si el usuario ya existe. Esta función javascript hace una llamada Ajax para llamar a un archivo php donde se accede a la base de datos.
Mi problema es que al hacer una prueba de login con un usuario que no existe el formulario me redirige a la página que pongo en el atributo "action", independientemente de que la función que hay en onsubmit devuelve false, pero si ejecuto la función javascript de validación paso a paso con la herramienta Firebug todo funciona bien. Se muestra un error en el formulario y el navegador no se redirige a la página indicada en "action".

Adjunto el código fuente para aclarar esto:
Formulario de login:
<form id="formLogin" name="formLogin" onsubmit="return validaLogin()" method="POST" action="pagina2.php">
<h1>Inicia sesión</h1>
<fieldset>
<label>Usuario/email: </label>
<input name="usuario" type="text" size="30" focused autocomplete />
<div id="error-usuario"></div>
<label>Contraseña: </label>
<input name="password" type="password" size="10" focused />
<div id="error-password"></div>
</fieldset>

<fieldset>
<input class="botonenviar" name="entrar" type="submit" value="Entrar" class="enviar" />
<input type="checkbox" name="recordarPass" value="recordarPass" /><label>&nbsp&nbspRecordar contraseña </label>
</fieldset>
</form>

Función Javascript validaLogin:
function validaLogin() {

if(compruebaLogin()){
return true;
}
else{
return false;
}

}

function compruebaLogin() {
//Se recuperan los inputs del formulario
var usuario = document.formLogin.usuario.value;
var password = document.formLogin.password.value;
var recordarPass = document.formLogin.recordarPass.checked;

var pagina = false;
if(window.XMLHttpRequest()){
pagina = new XMLHttpRequest();
}else {
if(window.ActiveXObject()) {
try {
pagina = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){

try{
pagina = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){}
}
}else{
return false;
}
}

pagina.onreadystatechange=function(){
if(pagina.readyState==4 && pagina.status==200){
var respuesta = pagina.responseText.evalJSON();

if(respuesta.error_usuario == "" && respuesta.error_password == "") {
return true;
} else {
document.getElementById('error-usuario').innerHTML=respuesta.error_usuario;
document.getElementById('error-password').innerHTML=respuesta.error_password;
return false;
}
}
}
var params = "usuario="+usuario+"&password="+password+"&checkbo x="+recordarPass;
pagina.open("POST","../lib/controller/validaUsuario.php",true);
pagina.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pagina.setRequestHeader("Content-length", params.length);
pagina.setRequestHeader("Connection", "close");
pagina.send(params);
}

Archivo php validaUsuario.php:

$nickname=htmlspecialchars(trim($_POST['usuario']));
$password=trim($_POST['password']);

$ent_usuario = new Usuario(); //entidad con los atributos de la tabla Usuario
$usuarioDAO = new UsuarioDAO(); //DAO para gestionar los accesos a la tabla Usuario
//La función compruebaLogin accede a la tabla usuario y devuelve el usuario 'nickname' o una entidad usuario vacía si no existe
$ent_usuario = $usuarioDAO->compruebaLogin($nickname, $password);

$error_usuario="";
$error_password="";
if($ent_usuario->nickname=="") {
$error_usuario = 'Usuario no existe. Regístrate <a href="#">aquí!</a>';
} else {
if($ent_usuario->password != $password) {
$error_password = 'Contraseña incorrecta';
}
}

$return = array("error_usuario" => $error_usuario, "error_password" => $error_password);
die(json_encode($return));

Com decía arriba. Si hago la prueba con un usuario que no existe debería mostrarse el error "Usuario no existe. Regístrate aquí"
en el <div id="error-usuario"></div> del formulario. Si hago esta prueba ejecutando paso a paso con Firebug todo funciona bien, pero si ejecuto sin ir paso a paso no se muestra el error y el navegador redirecciona a pagina2.php
  #2 (permalink)  
Antiguo 28/03/2013, 06:31
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: validación de login

Por favor, pon highlight al código, es muy costoso leerlo así.

Intenta con onsubmit="return (validaLogin())"

Y si no funciona trata de retornar en todos los casos false

onsubmit="validaLogin(); return false;"

y disparar tú el submit del formulario, el cual no disparará el evento onsubmit porque sólo se dispara cuando se presiona el botón de submit.

Código Javascript:
Ver original
  1. //.. si es correcto se envía automáticamente
  2.  
  3. document.formLogin.submit();
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #3 (permalink)  
Antiguo 28/03/2013, 09:26
 
Fecha de Ingreso: marzo-2013
Mensajes: 4
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: validación de login

Lo siento, no había visto la opción de highlight!

Muchas gracias por las sugerencias. No me han funcionado. Es muy raro porque aparentemente debería funcionar y como digo, si pongo un breakpoint con el FireBug en la línea if(pagina.readyState==4 && pagina.status==200) de la función compruebaLogin() y ejecuto paso a paso, todo funciona bien. Pero si lo pongo en la línea siguiente var respuesta = pagina.responseText.evalJSON(); y doy al play para que se pare ahí, ya no se para y deja de funcionar. Es como si la llamada Ajax no funcionase bien.

Vuelvo a poner el código con highlight:

Formulario de login:
Código HTML:
Ver original
  1. <form id="formLogin" name="formLogin" onsubmit="return validaLogin()" method="POST" action="pagina2.php">
  2.         <h1>Inicia sesión</h1>
  3.         <fieldset>
  4.             <label>Usuario/email: </label>
  5.             <input name="usuario" type="text" size="30" focused autocomplete />
  6.             <div id="error-usuario"></div>
  7.             <label>Contraseña: </label>
  8.             <input name="password" type="password" size="10" focused />
  9.             <div id="error-password"></div>
  10.         </fieldset>
  11.  
  12.         <fieldset>          
  13.           <input class="botonenviar" name="entrar" type="submit" value="Entrar" class="enviar" />
  14.           <input type="checkbox" name="recordarPass" value="recordarPass" /><label>&nbsp&nbspRecordar contraseña </label>
  15.         </fieldset>
  16.     </form>

Función Javascript validaLogin:
Código Javascript:
Ver original
  1. function validaLogin() {
  2.  
  3.         if(compruebaLogin()){
  4.             return true;
  5.         }
  6.         else{
  7.             return false;
  8.         }
  9.  
  10.     }
  11.  
  12.     function compruebaLogin() {
  13.         //Se recuperan los inputs del formulario
  14.         var usuario = document.formLogin.usuario.value;
  15.         var password = document.formLogin.password.value;
  16.         var recordarPass = document.formLogin.recordarPass.checked;
  17.  
  18.         var pagina = false;
  19.         if(window.XMLHttpRequest()){
  20.             pagina = new XMLHttpRequest();
  21.         }else {
  22.             if(window.ActiveXObject()) {
  23.                 try {
  24.                     pagina = new ActiveXObject("Msxml2.XMLHTTP");
  25.                 }catch(e){
  26.  
  27.                     try{
  28.                         pagina = new ActiveXObject("Microsoft.XMLHTTP");
  29.                     }catch(e){}
  30.                 }
  31.             }else{
  32.                 return false;
  33.             }
  34.         }
  35.  
  36.         pagina.onreadystatechange=function(){
  37.             if(pagina.readyState==4 && pagina.status==200){
  38.                 var respuesta = pagina.responseText.evalJSON();
  39.  
  40.                 if(respuesta.error_usuario == "" && respuesta.error_password == "") {
  41.                     return true;
  42.                 } else {
  43.                     document.getElementById('error-usuario').innerHTML=respuesta.error_usuario;
  44.                     document.getElementById('error-password').innerHTML=respuesta.error_password;
  45.                     return false;
  46.                 }
  47.             }
  48.         }
  49.         var params = "usuario="+usuario+"&password="+password+"&checkbox="+recordarPass;
  50.         pagina.open("POST","../lib/controller/validaUsuario.php",true);
  51.         pagina.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  52.         pagina.setRequestHeader("Content-length", params.length);
  53.         pagina.setRequestHeader("Connection", "close");
  54.         pagina.send(params);
  55.     }

Archivo php validaUsuario.php:

Código PHP:
Ver original
  1. $nickname=htmlspecialchars(trim($_POST['usuario']));
  2.     $password=trim($_POST['password']);
  3.  
  4.     $ent_usuario = new Usuario(); //entidad con los atributos de la tabla Usuario
  5.     $usuarioDAO = new UsuarioDAO(); //DAO para gestionar los accesos a la tabla Usuario
  6.     //La función compruebaLogin accede a la tabla usuario y devuelve el usuario 'nickname' o una entidad usuario vacía si no existe
  7.     $ent_usuario = $usuarioDAO->compruebaLogin($nickname, $password);
  8.  
  9.     $error_usuario="";
  10.     $error_password="";
  11.     if($ent_usuario->nickname=="") {
  12.         $error_usuario = 'Usuario no existe. Regístrate <a href="#">aquí!</a>';
  13.     } else {
  14.         if($ent_usuario->password != $password) {
  15.             $error_password = 'Contraseña incorrecta';
  16.         }
  17.     }
  18.  
  19.     $return = array("error_usuario" => $error_usuario, "error_password" => $error_password);
  20.     die(json_encode($return));
  #4 (permalink)  
Antiguo 28/03/2013, 13:33
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: validación de login

Vamos a ordenar un poco eso, si vas a usar Ajax para enviar el form, la idea es no tener que recargar la página del loguin, si no directamente envias con el submit, además un json para solo devolver la combinación user-pass?
Por otro lado tenés que prevenir que el usuario no deshabilite javascript

Esto deberías hacerlo asi
Código:
<!DOCTYPE html>
<html lang="es-ar">
<head>
<meta charset="utf-8" />
<title>Loguin</title>

<script type="text/javascript">
//<![CDATA[
//var Datos;
function valida(){
var us =document.getElementById('usuario');
var cl = document.getElementById('clave');
if((limpiar(us.value).length === 0)||(limpiar(cl.value).length === 0)){
alert('complete ambos campos');
return false; // hasta aqui si no completó los campos no pasa nada ya que devuelve false al evento onsubmit que llama la función con return
}else{
// ejecutamos ajax
var xmlHttp=null;
if (window.ActiveXObject){ 
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}else{ 
if (window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
} // creaste el objeto

xmlHttp.onreadystatechange=function(){ // ejecutás el código
  if (xmlHttp.readyState==4 && xmlHttp.status==200){

if(xmlHttp.responseText != 'ok'){
alert('nombre o clave incorrectos');
}else{
document.getElementById('loguin').style.display = "none";
document.getElementById('mensaje').innerHTML = "Estás logueado como " + us.value;
  }
}
  }
xmlHttp.open("POST",'entrar.php',true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send("usuario="+us.value+"&clave="+cl.value);
return false; // siempre devuelve flase para prevenir el submit

}
}
// función adicional para prevenir que te pasen caracteres en blanco
function limpiar(valor){
var valor_campo = valor.replace(/^\s+/g,'').replace(/\s+$/g,'');
return valor_campo;
}
//]]>
</script>
</head>
<body>
<p>Combinación válida = usuario:emprear, clave:fdw </p>
<form action="entrar.php" onsubmit="return valida();" id="loguin" method="post">
usuario: <input type="text" name="usuario" id="usuario" /><br />
passwd: <input type="password" name="clave" id="clave" /><br />
<input type="submit" value="ingresar" />
</form>
<p id="mensaje">
	<!-- mensaje loguin -->
</p>
</body>
</html>
un php simple para probarlo,

entrar.php

Código PHP:
Ver original
  1. <?php
  2. $u = $_POST['usuario'];
  3. $p = $_POST['clave'];
  4.  
  5. if(($u == "emprear") && ($p == "fdw")){
  6. echo "ok";
  7. }else{
  8. echo "usuario y/o clave no validas";
  9. }
  10.  
  11. ?>

En tu caso deberías consultar la base de datos, si la consulta sql arroja un resultado, obviamente en tu tabla la combinación usuario-contraseña debe de ser unica, haces un echo "ok", para que el ajax reciba la respuesta para evaluar, supongo también, que si hay validación exitosa, crearás las sesiones correspondientes

Demo funcionando (ejecutala con y sin javascript activado en el navegador

http://foros.emprear.com/ajax/loguin/

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 31/03/2013, 10:52
 
Fecha de Ingreso: marzo-2013
Mensajes: 4
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: validación de login

Muchas gracias emprear!!

Lo he hecho como dices y ya me funciona bien!! No sé por qué pero me he dado cuenta que si en la función validaLogin() hago la llamada Ajax todo funciona bien, pero si hago la llamada AJAX en otra función ya no funciona bien.

Me explico, en mi caso, en validaLogin además de hacer validaciones javascript de los campos del formulario llamaba a la función compruebaLogin(). Esta función hacía la llamada AJAX y devolvía true or false en función de las validaciones con la base de datos. Esto así no me funciona. El formulario se submite SIEMPRE.

Ahora lo he cambiado y he puesto la llamada AJAX como me has dicho, en la función validaLogin() y todo funciona bien.

Gracias a todos otra vez!
  #6 (permalink)  
Antiguo 31/03/2013, 11:05
 
Fecha de Ingreso: marzo-2013
Mensajes: 4
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: validación de login

Por cierto emprear! no he dicho nada, pero tienes razón también con lo de no tener que recargar toda la página al hacer la validación con AJAX! lo voy a cambiar!

Gracias!

Etiquetas: ajax, formulario, funcion, html, input, js, login, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:34.