RemoteLoginInterface $modality 'auto' y useEncryptedPassword=true

Issue #95 new
menxaca created an issue

Hola Christian,

Hay un problema a la hora de hacer un login a través de RemoteLoginInterface con $modality='auto' y con la variable de configuración useEncryptedPassword=true.

Caso que el usuario (bien de Facebook o Google) no existe en nuestra BD:

  • Cruge intenta hacer login con el email entregado, como no existe intentará crear un nuevo usuario.
  • Cruge crea un nuevo usuario y le asigna una contraseña aleatoria con CrugeUtil::passwordGenerator(). imaginemos que la contraseña generada es: 123456, al tener useEncryptedPassword=true, la contraseña será encriptada y será guardada en BD con el siguiente aspecto cd9458c845807d0fa55ae5ed17aef38a
  • Ahora Cruge emula el inicio de sesion tal cual se hubiese usado el formulario de login, respetandose el control de sesion y demas con la función CrugeUserManager::loginUser.

A partir de aquí empiezan los problemas:

  • Debido a que en la función CrugeUserManager::loginUser se está validando el modelo ($model->validate()), la siguiente regla de validación no se cumple ya que la contraseña guardada en DB es mayor de 20 caracteres:
array('password', 'length', 'max' => 20, 'on' => 'login'),
  • Si eliminamos la validacion y realizamos el $model->login directamente, nos encontramos ante otro problema. Basicamente la contraseñas que se comparan en la linea 77 de CrugeAuthDefault.php no son iguales debido a que se está haciendo el hash sobre la contraseña guardada en BD (que ya tiene hecho el hash).

No sé si me explico, se está comparando de este modo, imaginemos:

password_sin_hash = 123456

password_con_hash_guardado_en_DB = cd9458c845807d0fa55ae5ed17aef38a

Comparacion: $model->password == $this->_getPwd()

O lo que es lo mismo: password_con_hash_guardado_en_DB == CrugeUtil::hash(password_con_hash_guardado_en_DB)

La contraseña a la izquierda de la comparación tendrá hecho un hash, mientras que la contraseña a la derecha de la comparación tendrá hecho dos hash (porque se llama a _getPwd)

Espero haberme explicado bien :)

Un saludo!

Comments (3)

  1. Cristian Salazar repo owner

    hola, si hay un issue abierto si no me equivoco bajo un tema similar, es un problema que no he tenido tiempo de resolver ya que voy resolviendo issues en la medida en que un proyecto me obliga a hacerlo, esto por razones de trabajo,

  2. menxaca reporter

    No te preocupes, de momento lo he solucionado pasando un nuevo argumento a la funcion de login:

     //public function login($booleanThrowException = true)
     public function login($booleanThrowException = true, $avoidHash = false)
    
  3. Ramón Menor

    Actualmente he experimentado este error y me gustaría saber si hay o va ha haber alguna solución definitiva. Gracias.

  4. Log in to comment