Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1
RSS
Помогите с внешним порталом... Есть у кого-нибудь рабочий скрипт на PHP/CURL!?, UniFi Network
 
Я уже несколько недель пытаюсь создать простой портал для захвата данных на нашей системе Unifi. Сначала я начал с примера от helpfultechvids на YouTube с образцом скрипта с его сайта. У меня работает сама часть сбора данных, и база тестовых подключений постоянно растёт, но вот с авторизацией пользователей никак не получается.

Изначально, с образцом скрипта на версии контроллера 3.2.1, пользователь авторизовывался примерно 1 из 10 раз и правильно перенаправлялся. В остальных случаях авторизация проходила, но могла занять до 2 минут — к тому времени скрипт уже выкладывался по таймауту, и меня возвращало обратно на страницу сбора данных. В оставшееся время вообще ничего не происходило.

Потом я обновился до версии 3.2.5, и всё стало ещё хуже — ничего не авторизовывалось. Страница просто возвращала меня обратно в форму, а на стороне контроллера авторизации не было.

После обращения в поддержку Ubiquiti, мне посоветовали поставить версию 4.2.0 контроллера, но результат был такой же, как на 3.2.5. Затем предложили полностью заново настраивать систему, не используя бэкапы — но проблема осталась.

Сейчас я откатился обратно на 3.2.1, так как только на ней хоть что-то работало, но теперь и она вообще не функционирует.

Я уже почти головой в стену стучу, пытаясь это всё запустить. Надеюсь, кто-то, кто сталкивался с похожими проблемами, сможет помочь. Контроллер работает на Windows Server 2003, Apache и MySQL — через XAMPP, поэтому, думаю, единственный рабочий вариант — использовать CURL-скрипт через API. Внешний портал от Ubiquiti не подходит, судя по всему, он рассчитан под Linux, и я не могу его адаптировать. Пытался изменить встроенный портал, но любые PHP-скрипты, встроенные в HTML, просто не запускаются.

Отмечу, что я вовсе не профессиональный разработчик — немного знаю PHP и CSS, надеялся, что этого хватит, но скрипты я не понимаю полностью, так что возможно, я просто упускаю что-то очевидное.

Буду очень благодарен за любую помощь.

Ниже приведён скрипт, которым я пользуюсь для авторизации. Также я пробовал использовать PHP-класс, предоставленный другим пользователем, но результат был тот же.

function sendAuthorization($id, $minutes) {
////////////////////////////////////////////////////////////­/////////////////////////////////////////////////
   $unifiServer = "https://10.128.5.62:8443";
   $unifiUser = "user";  <--- изменено для отправки сюда!
   $unifiPass = "password";  <--- изменено для отправки сюда!
////////////////////////////////////////////////////////////­/////////////////////////////////////////////////
   
   // Запускаем Curl для входа
   $ch = curl_init();
   // Отправляем данные методом POST
   curl_setopt($ch, CURLOPT_POST, TRUE);
   // Настраиваем куки
   $cookie_file = "/tmp/unifi_cookie";
   curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
   // Разрешаем самоподписанные сертификаты
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   // Принудительно SSL3
   curl_setopt($ch, CURLOPT_SSLVERSION, 3);
   // Вход в контроллер UniFi
   curl_setopt($ch, CURLOPT_URL, "$unifiServer/login");
   curl_setopt($ch, CURLOPT_POSTFIELDS,
       "login=login&username=$unifiUser&password=$unifiPass");
   // отправляем команду входа
   curl_exec ($ch);
   // Отправляем пользователя на авторизацию и время действия
   $data = json_encode(array(
       'cmd'=>'authorize-guest',
       'mac'=>$id,
       'minutes'=>$minutes));
   // Отправляем команду в API
   curl_setopt($ch, CURLOPT_URL, $unifiServer.'/api/cmd/stamgr');
   curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.$data);
   curl_exec ($ch);
   // Выходим из контроллера UniFi
   curl_setopt($ch, CURLOPT_URL, $unifiServer.'/logout');
   curl_exec ($ch);
   curl_close ($ch);
   unset($ch);
}

Спасибо, что дочитали до этого места!  
Алан
 
Вот что я сделал: https://community.ui.com/questions/59dfece8-fd1b-4a91-be22-e7403686d253
 
У меня проблема при использовании массива в CURLOPT_POSTFIELDS, а вот с обычной строкой всё работает отлично. Понимаю, что странно, но не могу понять, почему так происходит. Вот мой рабочий пример (тестировал на PHP 5.6 и UniFi 3.2.10):

$cookie = '/tmp/unifi_cookie';  
$user = 'ubnt';  
$pass = 'ubnt';  
$url = 'https://localhost:8443';  
$site = 'default';  

$ch = curl_init();  
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);  
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);  
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_URL, "$url/login");  
curl_setopt($ch, CURLOPT_POST, true);  
//curl_setopt($ch, CURLOPT_POSTFIELDS, array('login' => 'login', 'username' => $user, 'password' => $pass)); // не работает, поэтому закомментировал  
curl_setopt($ch, CURLOPT_POSTFIELDS, "login=login&username=$user&password=$pass");  

echo curl_exec($ch);  

curl_setopt($ch, CURLOPT_HTTPGET, true);  
curl_setopt($ch, CURLOPT_URL, "$url/api/s/$site/stat/sta");  

echo curl_exec($ch);
 
Привет! Эта проблема решена? Или есть какие-нибудь подсказки, как её исправить? Спасибо!
 
Вот что выдает мне журнал ошибок:  
[Ср 01 июл 08:19:44.574409 2015] [core:notice] [pid 1806] AH00094: Команда запуска: '/usr/sbin/apache2'
[Ср 01 июл 08:20:14.878205 2015] [:error] [pid 16962] [client 46.59.76.5:47529] PHP Notice: Неопределённый индекс: id в /var/www/html/guest/s/wc7qf86g/index.php на строке 8
[Ср 01 июл 08:20:14.878260 2015] [:error] [pid 16962] [client 46.59.76.5:47529] PHP Notice: Неопределённый индекс: ap в /var/www/html/guest/s/wc7qf86g/index.php на строке 9
[Ср 01 июл 08:20:14.878266 2015] [:error] [pid 16962] [client 46.59.76.5:47529] PHP Notice: Неопределённый индекс: ssid в /var/www/html/guest/s/wc7qf86g/index.php на строке 10
[Ср 01 июл 08:20:14.878271 2015] [:error] [pid 16962] [client 46.59.76.5:47529] PHP Notice: Неопределённый индекс: t в /var/www/html/guest/s/wc7qf86g/index.php на строке 11
[Ср 01 июл 08:20:14.878276 2015] [:error] [pid 16962] [client 46.59.76.5:47529] PHP Notice: Неопределённый индекс: url в /var/www/html/guest/s/wc7qf86g/index.php на строке 12
 
Я использую версию 4.6.6 и столкнулся с проблемами. Вот мой файл authorized.php:

```php
<?php
session_start();

function sendAuthorization($id, $minutes)
{
   $unifiServer = "https://<ip>:8443";
   $unifiUser = "<user>";
   $unifiPass = "<password>";

   // Запускаем Curl для входа
   $ch = curl_init();
   // Отправляем данные методом POST
   curl_setopt($ch, CURLOPT_POST, TRUE);
   // Настраиваем cookies
   $cookie_file = "/tmp/unifi_cookie";
   curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
   // Разрешаем самоподписанные сертификаты
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   // Принудительно SSL3
   curl_setopt($ch, CURLOPT_SSLVERSION, 1);
   // Входим в UniFi контроллер
   curl_setopt($ch, CURLOPT_URL, "$unifiServer/api/login");
   // curl_setopt($ch, CURLOPT_POSTFIELDS, "login=login&username=$unifiUser&password=$unifiPass");
   $data = json_encode(array("username" => $unifiUser, "password" => $unifiPass));
   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
   curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
   // Отправляем команду входа
   curl_exec($ch);

   // Авторизуем пользователя и задаём время доступа
   $data = json_encode(array(
       'cmd' => 'authorize-guest',
       'mac' => $id,
       'minutes' => $minutes
   ));

   // Отправляем команду в API
   curl_setopt($ch, CURLOPT_URL, $unifiServer.'/api/cmd/stamgr');
   curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.$data);
   curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
   curl_exec($ch);

   // Выходим из UniFi контроллера
   curl_setopt($ch, CURLOPT_URL, $unifiServer.'/logout');
   curl_exec($ch);
   curl_close($ch);
   unset($ch);
}

if ($_SESSION['loggingin'] == "<key>") // Проверяем, была ли отправлена форма
{
   ob_start();
   sendAuthorization($_SESSION['id'], (2*60)); // авторизуем пользователя на 12 часов
   ob_end_clean();
   unset($_SESSION['loggingin']);
}
?>

Подключение к сети...

<script>
// даем время на прохождение авторизации
setTimeout("location.href='http://www.Google.com'",6000);
</script>
```

И мой index.php:

```php
<?php
// PHP скрипт для простого портала
// Требования:
// curl должен быть включен (php_curl.dll для Windows)

session_start();

$_SESSION['id'] = $_GET['id']; // MAC-адрес пользователя
$_SESSION['ap'] = $_GET['ap']; // MAC AP
$_SESSION['ssid'] = $_GET['ssid']; // SSID, к которому подключен пользователь (POST 2.3.2)
$_SESSION['time'] = $_GET['t']; // время запроса портала пользователем
$_SESSION['refURL'] = $_GET['url']; // URL, который пытался открыть пользователь
$_SESSION['loggingin'] = "123"; // ключ для проверки, использовал ли пользователь эту форму
                                      // -- предотвращает доступ к authorized.php напрямую

?>
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>Пример портальной страницы</title>
</head>

<body>
   <form name="login" action="authorized.php" method="post">
       <input id="submit" type="submit" name="submit" value="Подключиться" />
   </form>
</body>
</html>
```

Просто тестирую примеры. Пробовал решения из этой темы, но, как всегда, меня кидает обратно на страницу входа.
 
Мы знаем, работает ли это в версии 4.6.3?
 
Используя это, я не получаю ошибок в PHP-скрипте (даже в логе ошибок сервера), но пользователь не аутентифицируется в контроллере. Это ложное срабатывание аутентификации.

Это происходит на версии 4.2.

Обновлений на данный момент нет. Мне сказали, что исправление будет в следующем выпуске 4.x.x.
 
Используя это, я не получаю ошибок в PHP-скрипте (даже в логе ошибок сервера), но пользователь не аутентифицируется в контроллере. Это ложное срабатывание аутентификации. Это происходит на версии 4.2.
 
Поменяйте эту строку: curl_setopt($ch, CURLOPT_SSLVERSION, 3); на: curl_setopt($ch, CURLOPT_SSLVERSION, 1);
 
Спасибо. Похоже, это решило проблему... (использую версию 3.2.7 с внешним порталом). Я сообщу, если проблема повторится.
 
Проблема с неработающими внешними авторизациями, похоже, связана с этой темой: https://community.ui.com/questions/7c02bf01-c114-4a19-a2bb-dc157d945550#answer/663ba36e-2177-4e71-9d25-a07d75ecf695. Если ваш портал входа работает на той же машине, что и контроллер Unifi, вы можете попробовать запускать shell-команды (с помощью unifi_sh_api) для аутентификации пользователей.
 
Есть новости по исправлению внешней авторизации в версии 4.2? Я пытался понизить версию до 3.2.5 на тестовом сервере, но постоянно получаю ошибку HTTP 500, даже после полного удаления mongodb-10gen и unifi-beta/unifi. Так что ни за что не возьмусь за рабочий контроллер 4.2 в продакшене, который отвечает за живую авторизацию.
Страницы: 1
Читают тему (гостей: 1)