我目前正在开发一个使用prestashop Web服务的应用程序。这意味着我正在构建的应用程序是现有prestashop应用程序的扩展。两个应用程序之间的连接是通过prestashop Web服务实现的
目前,我正在尝试为customers
创建一个登录脚本。电子邮件和密码是通过Web服务从数据库中获得的,我可以用现有的行过滤输入。所以在填写时login@test.com.过滤器将只获取具有该电子邮件地址的行。
我遇到的问题是密码问题。Prestashop使用_COOKIE_KEY_
和md5()
来加密密码。有关更多信息,请参阅此链接:链接
所以我已经尝试了一些不同的方法来检查输入的密码和客户的密码,但我还没有找到解决方案。
看看下面的代码:
<?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_verify
和md5()
之类的东西,但我不太明白。那么,有没有人做过这件事,或者知道如何在prestashop Web服务上创建正确的登录脚本?
更新--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 = '$2y$10$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>';
}
第二个小问题:我如何才能在成功语句中运行->转到url,目前echo "<script></script>";
不工作,由于header()
不能使用,我在成功重定向时遇到了一些问题。
一如既往,提前感谢!
要生成cookie密钥,prestashop使用:
array('_COOKIE_KEY_', Tools::passwdGen(56)),
array('_COOKIE_IV_', Tools::passwdGen(8)),
所以每次的cookie密钥都不一样。为了验证密码是否正确,您应该从数据库中获取现有密码,并与用户提交的密码进行比较:
//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则是您的密码
如果PrestaShop版本为1.6,则加密客户密码的函数为Tools::encrypt($passwd)。这种方法就是这样做的:
return md5(_COOKIE_KEY_.$passwd);
因此,知道_COOKIE_KEY_,您必须能够生成哈希。_COOKIER_KEY_在config/settings.inc.php 中定义
如果PrestaShop版本为1.7,则不使用Tools,并且可能md5(_COOKIE_KEY_.$passwd)将不匹配。它使用Symfony的加密货币。
然而,我想PrestaShop Web服务必须有一些东西来检查用户,在Customer类中有一个方法getByEmail(…),它在1.6和1.7版本中都使用。
谨致问候。