Рабочая авторизация на сайте через API в DLE
Не знаю, как сейчас обстоят дела со встроенным API в CMS DataLife Engine, но в релизах ветки 10.* и 11.* точно есть одна проблема. А именно – при использовании метода:
$dle_api->external_auth($login, $password);
вместо реальной авторизации происходит простая проверка корректности логина и пароля указанного пользователя.
Очень странно, что в официальной документации этот метод описывается как «Авторизация по логину и паролю», хотя на деле, как я уже сказал ранее, происходит проверка корректности указанных данных.
Уверен, что многие, кто кастомизирует этот движок, столкнулись с этой проблемой, как, собственно, и я.
Весьма красивое решение мне удалось найти, создавая один из своих модулей, и выглядит оно так:
ini_set('error_reporting', 0);
ini_set('display_errors', 0);
define('DATALIFEENGINE', true);
define('ROOT_DIR', substr(dirname(__FILE__), 0, -12));
define('ENGINE_DIR', ROOT_DIR.'/engine');
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
include ENGINE_DIR.'/data/config.php';
require_once ENGINE_DIR.'/modules/functions.php';
include ENGINE_DIR.'/api/api.class.php';
$login = (string)$_POST['login']; // Логин пользователя
$password = (string)$_POST['password']; // Пароль пользователя
if($dle_api->external_auth($login, $password)) {
$_POST['login_name'] = $login;
$_POST['login_password'] = $password;
$_POST['login'] = 'submit';
dle_session();
require_once ENGINE_DIR.'/modules/sitelogin.php';
echo '<script>window.location.replace(window.location.pathname);</script>'; // Обновляем страницу после авторизации
} else {
echo 'Данные не верны!';
}
}
В этот PHP-скрипт (обработчик, который нужно размещать в папке /engine/ajax/ вашего сайта) через AJAX передаются данные, которые проверяются на корректность авторизации (через API) и уже посредством стандартной функции CMS происходит авторизация на сайте.
Стоит отметить, что способ универсален и не зависит от версии CMS.
Если что-то вам показалось непонятным – не стесняйтесь и задавайте свои вопросы в комментариях.