Problema al autentificar desde un móvil a API symfony

Hola a todos. Intento desde una app Android, loguearme en un API de Symfony 3. El problema radica en que yo encripto el texto plano en el móvil, pero el encriptado no coincide con el almacenado en la base de datos.

Según he podido ver, el encriptado es la suma del password más el salt que genera Symfony. ¿Dónde puedo ver ese salt y como podria combinarlo? Un saludo.

Respuestas

#1

En este artículo de la documentación de Symfony puedes encontrar los detalles sobre cómo se codifican las contraseñas. En concreto, se concatenan el $password en claro y el $salt de la siguiente manera y luego se codifican con la función hash definida:

$password.'{'.$salt.'}'

En tu caso, como usas bcrypt, el valor de $salt es null, ya que Bcrypt genera un salto automáticamente y lo incluye dentro del propio password.

#2

Gracias por la respuesta. He probado pero no he resuelto el problema, a ver si puedo explicarme mejor. Primero enviaba desde una app Android un pass pasado por el bcrypt de Java, después hacia la consulta:

$user = $this->manager->getRepository("EntityBundle:User")->findOneBy(array("email" => $user->getEmail(), "password" => $password));

Claro cuando encripta Symfony usa el user de ese usuario, de esta manera es imposible que yo desde Java pueda generar el mismo hash. Después probe a pasar el password en texto plano para después en Symfony utilizando el user y según pone en el manual.

$user = new User();
$encoder = $this->container->get('security.password_encoder');
$encoded = $encoder->encodePassword($user, $json->password);

Para que el pass coincidiera con el de la base de datos, cosa que tampoco hace ya que no coinciden. No se si es que no acabo de pillar el concepto del funcionamiento de bcrypt.

Un saludo y gracias por las respuestas

#3

En primer lugar, comprueba que las contraseñas es están codificando correctamente en Java usando bcrypt. El formato debería ser algo así:

$2y$13$F9Vbyx2GyBuWJDKwXc76x.QL62GZP.4Fw7A6s2HmkNKeby.EKZPDG

La parte $2y$ es fija, el número que va detrás (13 en este caso) es el "coste" utilizado para codificar la contraseña y luego ya viene el salt, la contraseña, etc.

No debería haber problema, pero comprueba si tanto Java como Symfony están utilizando el mismo "coste" para generar las contraseñas. Aquí se explica cómo cambiar este valor en Symfony.

Otra posible solución es la siguiente: ya que Java te va a codificar las contraseñas con Bcrypt, puedes decirle a Symfony que use "contraseñas en claro". El motivo es que la contraseña ya viene codificada, por lo que Symfony no tiene que volver a codificarla. Para ello, utiliza algo así:

# app/config/security.yml
security:
    encoders:
        AppBundle\Entity\User: plaintext
#4

ok gracias a todos, al final resolví el problema, symfony dispone de una función propia del bundle de seguridad

$this->get('security.password_encoder')->isPasswordValid($user, $password )

pasándole el objeto del usuario y el pass en texto plano nos lo validad. Un saludo