создание функции входа клиента с помощью веб-сервиса prestashop


создание функции входа клиента с помощью веб-сервиса prestashop

07.11.2017 04:02:47 Просмотров 37 Источник

В настоящее время я работаю над приложением, которое использует веб-сервис 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

José Carlos PHP

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.

С уважением.

Является ответом!
Pascut

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 - ваш пароль

Помочь в развитии проекта:
Закрыть X