使用 prestashop 网络服务创建客户登录功能

creating a customer login function using the prestashop webservice

我目前正在开发一个使用 prestashop 网络服务的应用程序。这意味着我正在构建的应用程序是现有 prestashop 应用程序的扩展。两个应用程序之间的连接是通过 prestashop webservice

目前我正在尝试为 customers 创建一个登录脚本。电子邮件和密码是通过网络服务从数据库中获取的,我能够使用现有行过滤输入。所以在填写login@test.com的时候。过滤器将只获取具有该电子邮件地址的行。

我遇到的问题是密码。 Prestashop 使用 _COOKIE_KEY_md5() 来加密密码。有关详细信息,请参阅此 link:link

所以我一直在尝试一些不同的方法来检查输入的密码和客户密码,但我还没有找到解决方案。

看看下面的代码:

<?php

require_once('./PSWebServiceLibrary.php');

/**
 * get information from PrestaShop
 */

$webService = new PrestaShopWebservice($url, $key, $debug);

define('_COOKIE_KEY_', '...');
$email = "login@test.nl";
define('password', "test");
$md5passwd = md5(_COOKIE_KEY_ . password);

$opt = array(
    "resource" => "customers",
    "display" => "[email , passwd]",
    "filter[email]" => "$email"
);

$optPass = array(
    "resource" => "customers",
    "display" => "[email]",
    "filter[email]" => "$email",
    "filter[passwd]" => "$md5passwd"
);

$jsonPass = ($webService->get( $optPass ));

//json encode it
$jsonPasswd = json_encode($jsonPass);

echo($jsonPasswd);


if(password_verify($md5passwd, $jsonPasswd)) {
    echo "password is valid";
} else {
    echo "password is not valid";
}

$jsonUrl = ($webService->get( $opt ));

//json encode it
$json = json_encode($jsonUrl);

echo($json);

如您所见,我一直在尝试 password_verifymd5() 之类的东西,但我不太明白。那么有没有人做过这个或者谁知道如何在 prestashop 网络服务上创建正确的登录脚本?

更新 -- 12/1/2017 所以在做了一些研究之后,我想出了一种检查用户输入的新方法。首先,代码会检查电子邮件,如果是,它将继续检查密码输入。但我遇到的问题是 prestashop 的密码和密码加密。我无法将两个哈希值放在一起进行比较。第一个散列是来自数据库的散列,第二个散列是用户输入的密码。输入需要来自 prestashop 的 hash() 函数。但是我不太了解 prestashop 的正确哈希序列。

我已经在整个互联网上搜索了这个,但找不到通过 prestashop 网络服务登录的合适解决方案。我为登录创建的脚本如下所示。

require_once('./PSWebServiceLibrary.php');

/**
 * get information from PrestaShop
 */

$webService = new PrestaShopWebservice($url, $key, $debug);

$COOKIE_KEY = '_key';
$email = $_REQUEST['email'];
$password = md5('_key' . $_REQUEST['password']);

// The database hash for testing (random)
$passwordString = 'y$UsYrIFQUOr5LBUZBoqSdxODuhbToEc.2QEqfAVB1r\/fhO5EfOyO96';

$opt = array(
    'resource'       => 'customers',
    'filter[email]'  => '['.$email.']',
    'display' => '[email,lastname,firstname, passwd]'
);

$result = ($webService->get( $opt ));

$json = json_encode($result);


$optUser = array(
    'resource'       => 'customers',
    'filter[email]'  => '['.$email.']',
    'display' => '[email,lastname,firstname,passwd]'
);

$resultUser = ($webService->get( $optUser ));

$userResult = json_encode($resultUser);

// Check the email
function hasEmail($string, $email)
{
    return strpos($string, $email) !== false;
}

// Check the Password
function hasPassword($string, $password)
{
    return strpos($string, $password) !== false;
}

if(hasEmail($userResult, $email) == true and hasPassword($userResult, $password) == true)  {
    session_start();
    $_SESSION['user'] = $email;
    // redirect is kut.
    echo
        '<html>
         <head>
           <meta content="text/html; charset=utf-8">
         </head>
         </html>';
} else {
// Here, we use single quotes for PHP and double quotes for JavaScript
    echo '<script type="text/javascript">';
    echo 'alert("Wrong username or password!")';
    echo '</script>';
}

第二个小问题:我如何能够 运行 a -> 在成功语句中转到 url,目前 echo "<script></script>"; 不工作,因为 header() 无法使用我在成功重定向时遇到了一些问题。

一如既往,提前致谢!

如果PrestaShop版本是1.6,加密客户密码的函数是Tools::encrypt($passwd)。这个方法就是这样做的:

return md5(_COOKIE_KEY_.$passwd);

所以知道 _COOKIE_KEY_ 你一定能够生成哈希。 _COOKIER_KEY_ 定义在 config/settings.inc.php

如果 PrestaShop 版本是 1.7,则不使用工具,可能 md5(_COOKIE_KEY_.$passwd) 不匹配。它使用来自 Symfony 的加密货币。

但是,我想 PrestaShop web 服务必须有一些东西来检查用户,在 Customer class 中有方法 getByEmail(...) 在 1.6 和 1.7 版本中都使用。

此致。

要生成 cookie 密钥,prestashop 使用:

array('_COOKIE_KEY_', Tools::passwdGen(56)),
array('_COOKIE_IV_', Tools::passwdGen(8)),

所以那个 cookie key 每次都不一样。为了验证密码是否正确,您应该从数据库中获取现有密码并与用户提交的密码进行比较:

//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

这是您要求的部分:

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

其中 $resultZC['password'] 是存储在数据库中的密码,$passwd 是您的密码