Hoy os traemos un interesante artículo de João Cunha sobre cómo realizar la migración de contraseñas de cliente de un ZenCart o un OsCommerce (que utilizan una codificación similar) a un prestashop. Lo hemos podido comprobar con un prestashop 1.6 y funciona correctamente.

Cuando estamos migrando desde un ZenCart/OsCommerce a PS nos encontramos con un problema fundamental: Las contraseñas de los clientes. No se guardan directamente en base de datos, sino que se guarda el resultado de aplicarle un algoritmo que, usando como base MD5, devuelve un hash. Cuando un usuario inicia sesión con su contraseña, se le aplica a ésta un algoritmo y el resultado es un hash de 32 caracteres más dos puntos ( : ) y dos caracteres aleatorios denominados salt, que se usan para evitar ataques de diccionario. El resultado es una cadena de 35 caracteres como, por ejemplo, ésta:

e56d64755f66a86996b54114bb4102bf:08

Prestashop también utiliza una codificación de contraseña basada en MD5 pero la ejecuta de forma diferente. Prestashop también genera una cadena hash, pero de 32 caracteres en lugar de los 35, de forma que, si intentamos importarlas directamente, Prestashop nos mostará un error y no se importará nada.

¿Qué soluciones tenemos? Podemos migrar los usuarios sin la contraseña y después enviarles un link a cada uno para pedirles que la reseteen. Quizá sea viable si no tenemos muchos clientes, pero desde luego muchos se nos van a caer. También podríamos integrar un mensaje en el login de nuestra nueva página de prestashop en el que le pidamos a los usuarios que, por favor, pulsen en ‘No recuerdo mi contraseña’ para que puedan generar una nueva, pero no son soluciones muy elegantes. Nosotros proponemos modificar nuestro prestashop para que acepte las antiguas contraseñas.

Pues manos a la obra:Lo primero y más importante es que hagamos una copia de seguridad de nuestra base de datos, y que hagamos todas las pruebas en un entorno de desarrollo, nunca sobre producción. No nos hacemos responsables si alguien pierde todos sus datos o hace algún destrozo, usad estas instrucciones bajo vuestra propia responsabilidad.

Debemos crear una nueva tabla (en nuestro ejemplo la llamamos zc_legacy_passwords, pero puede llamarse como queramos) que alojará las contraseñas antiguas de nuestros clientes. El script de creación es:

CREATE TABLE zc_legacy_passwords (
  id INT NOT NULL,
  PRIMARY KEY(id),
  email VARCHAR(100),
  password VARCHAR(35),
  updated BOOLEAN NOT NULL
);

Ahora debemos importar los campos id, email y password desde ZenCart/OsCommerce a nuestra nueva tabla. Los extraemos con nuestro editor sql favorito  y los insertamos en nuestra nueva tabla de Prestashop. El campo updated podéis dejarlo en blanco o bien insertar un 0, este campo indicará después si el usuario ya ha sido migrado o no.

A continuación editamos el archivo classes/Customer.php y buscar la función getByEmail($email, $passwd = NULL), suele estar aproximadamente por la línea 217 (dependiendo de la versión exacta de nuestro prestashop) y cambiamos las líneas:

if (!$result)
return false;

por

// == BEGIN ZEN-CART / OSCOMMERCE TO PRESTASHOP PASSWORD INTEGRATION ==
// == BY João Cunha - this.person@joaocunha.eti.br
// == @ 31/03/2012
// == USE AND MODIFY AT WILL
// == TESTED ON PRESTASHOP V1.4.7X
if (!$result) { //<- INVALID PRESTASHOP LOGIN, IT MAY BE A ZEN-CART / OSCOMMERCE PASSWORD
//CHECK IF THE GIVEN EMAIL MATCHES A ROW IN OUR LEGACY TABLE AND RETRIEVES THE LEGACY PASSWORD
$resultZC = Db::getInstance()->getRow('
SELECT `password`
FROM `zc_legacy_passwords`
WHERE `email` = \''.pSQL($email).'\'
AND `updated` = 0');

if (!$resultZC)
return false; //<- EMAIL NOT FOUND IN NONE OF THE TABLES, SO IT IS AN INVALID LOGIN

//ENCRYPTS THE GIVEN PASSWORD IN ZEN-CART / OSCOMMERCE FORMAT
$salt = substr($resultZC['password'], strrpos($resultZC['password'],':')+1, 2);
$ZCpassword = md5($salt . $passwd) . ':' . $salt;

if ($ZCpassword != $resultZC['password'])
return false; //<- WRONG ZEN-CART/OSCOMMERCE PASSWORD GIVEN

//WE'LL UPDATE THE CUSTOMER TABLE WITH ITS PRESTASHOP ENCRYPTED PASSWORD...
Db::getInstance()->Execute('
            UPDATE `'._DB_PREFIX_ .'customer`
            SET `passwd` = \''.md5(pSQL(_COOKIE_KEY_.$passwd)).'\'
            WHERE `email` = \''.pSQL($email).'\'');

//...AND FLAG IT AS UPDATED, SO THE NEXT TIME HE LOGS IN, HE WON'T ENTER THIS ROUTINE.
Db::getInstance()->Execute('
            UPDATE `zc_legacy_passwords`
            SET `updated` = 1
            WHERE `email` = \''.pSQL($email).'\'');

//USER IS AUTHENTICATED, OVERWRITE THE EMPTY $result VARIABLE
$result = Db::getInstance()->getRow('
SELECT *
FROM `'._DB_PREFIX_ .'customer`
WHERE `active` = 1
AND `email` = \''.pSQL($email).'\'
AND `deleted` = 0
AND `is_guest` = 0');
}
// == END ZEN-CART / OSCOMMERCE TO PRESTASHOP PASSWORD INTEGRATION

Guardamos y ya estamos listos! Cuando un cliente antiguo inicie sesión por primera vez su contraseña se valida contra la nueva tabla en lugar de contra la estándar de prestashop, y el script actualiza la tabla de clientes con una contraseña de prestashop. Todo esto es transparente para el cliente, que no verá ni notará nada extraño.

Un saludo y gracias por leernos!

 

 

 

Este sitio usa cookies. Si continúa navegando da su consentimiento para el uso de dichas cookies y la aceptación de nuestra política de cookies. ACEPTAR

Aviso de cookies

Pin It on Pinterest

Share This