создание функции входа клиента с помощью веб-сервиса prestashop
В настоящее время я работаю над приложением, которое использует веб-сервис prestashop. Это означает, что приложение, которое я создаю, является расширением существующего приложения prestashop. Соединение между обоими приложениями осуществляется через веб-сервис prestashop
В настоящее время я пытаюсь создать сценарий входа в систему для thecustomers
. Электронная почта и пароль получаются из базы данных через веб-сервис, и я могу фильтровать входные данные с помощью существующих строк. login@test.com фильтр получит только строку с этим адресом электронной почты.
Проблема, с которой я столкнулся, связана с паролем. Prestashop использует _COOKIE_KEY_
вместе с anmd5()
для шифрования паролей. Смотрите эту ссылку для получения дополнительной информации: ссылка
Поэтому я уже некоторое время пробую разные вещи, чтобы проверить введенный пароль с паролем клиентов, но я еще не нашел решение.
Взгляните на код ниже:
<?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?
Обновление -- 12/1/2017
Поэтому после проведения некоторых исследований я придумал новый способ проверки пользовательского ввода. Сначала код проверяет электронную почту, и если это правда, то он продолжит проверку ввода пароля. Но проблема, с которой я столкнулся, заключается в пароле и парольном шифровании prestashop. Я не могу сравнить эти два хэша вместе. Первый хэш был бы хэшем из базы данных, если бы второй хэш был паролем ввода пользователя. Для ввода потребуется функция hash()
из prestashop. Но я не могу полностью добраться до правильной хэш-последовательности 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>';
}
Маленький второй вопрос: как бы я мог запустить a - > go to url в заявлении об успехе, в настоящее время echo "<script></script>";
не работает, и поскольку header()
не может быть использован, у меня возникли некоторые проблемы с перенаправлением на succes.
Как всегда, заранее спасибо!
Ответы - создание функции входа клиента с помощью веб-сервиса prestashop / creating a customer login function using the prestashop webservice

04.12.2017 12:55:10
если версия PrestaShop-1.6, то функция шифрования паролей клиентов-это Tools:: encrypt($passwd). Этот метод просто делает это:
return md5(_COOKIE_KEY_.$passwd);
Таким образом, зная _COOKIE_KEY_, вы должны быть в состоянии генерировать хэш. _COOKIER_KEY_ определяется в config / settings.инк.РНР
Если PrestaShop версия 1.7, инструменты не используются и, возможно, md5(_COOKIE_KEY_.$passwd) не будет совпадать. Он используется крипто от Symfony.
Тем не менее, я думаю, что PrestaShop webservice должен иметь что-то для проверки пользователей, в классе Customer есть метод getByEmail(...), который используется как в версии 1.6, так и в версии 1.7.
С уважением.

07.12.2017 06:09:00
Для генерации ключа электронной печенья использует:
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 - ваш пароль