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

Пример использования для авторизации MAC-адреса на 60 минут:

$unifi = new unifiapi("username", "password", "https://<ip_of_unifi>:84443");
$unifi->login();
$unifi->authorize_guest("mac adress", 60);
 
Спасибо за отличный скрипт! Не мог бы ты выложить пример использования для получения неиспользованных ваучеров? Спасибо.
 
Нет ответа, я выложил на github. https://github.com/fbagnol/class.unifi.php
 
Привет, очень классный класс. Я добавил 2 метода: list_aps — вывести список всех AP, restart_ap — перезагрузить AP (надо передать ему MAC-адрес в параметре). Можно ли выложить этот класс на GitHub? Так будет удобнее для последующих изменений. С уважением, FredB
 
Небольшое обновление: столкнулся с проблемой, что PHP5.6 неправильно устанавливает SSL-соединение. Предполагаю, что более новые версии SSL/TLS умеют лучше договариваться о безопасности, поэтому строки 366-370 можно спокойно удалить:

if($this->controller >= 4) {
   curl_setopt($ch, CURLOPT_SSLVERSION, 6);
} else {
   curl_setopt($ch, CURLOPT_SSLVERSION, 3);
}

Если после этого появятся проблемы, попробуйте изменить строку 367 с

curl_setopt($ch, CURLOPT_SSLVERSION, 6);

на

curl_setopt($ch, CURLOPT_SSLVERSION, 1);

Предполагается, что вы используете версию, которую я обновил — вот тут.
 
Но в классе он задаёт параметры. Вы МОЖЕТЕ включить параметры, но, по моему мнению, это не обязательно. Если вы включите параметры, это просто переопределит значения переменных по умолчанию.
 
Я не очень силён в ООП, так что могу ошибаться, но если я правильно помню, Public означает, что переменные доступны и изменяемы из вне класса, так что, думаю, да, параметры нужно указывать. Я только подправил исходный код, который выложил автор вопроса, чтобы попытаться заставить его работать с Controller V4. Если что-то не работает как нужно, попробуйте заставить класс думать, что вы используете Controller V4, возможно, некоторые изменения из V4 уже влились в V3, а у меня нет возможности проверить это на V3.
 
Большое спасибо за код, но у меня возникла небольшая проблема с авторизацией. Я использую контроллер версии 3.2.10, а мой портал размещён на внешнем веб-сервере. До сегодняшнего дня я использовал код, который нашёл где-то в интернете, и он всегда работал довольно неплохо, хоть и нельзя сказать, что он очень чистый. Я попробовал ваш класс — ошибок при запуске нет, но гости не авторизуются, когда я выполняю код.

$unifi = new unifiapi();
$unifi->login();
$unifi->authorize_guest($mac, $minutes);

В ваших классах объявлены все публичные переменные, так что мне не нужно передавать параметры (верно?). Кто-нибудь может подсказать, что я делаю не так?

Вот код, который у меня работает:

function sendAuthorization($id, $minutes, $url) {
   global $unifiServer;
   global $unifiUser;
   global $unifiPass;

   ////////////////////////////////////////////////////////////­///////////////////////////////////////////////
   $unifiServer = "https://x.x.x.x:8443";
   $unifiUser = "user";
   $unifiPass = "pw";
   ////////////////////////////////////////////////////////////­/////////////////////////////////////////////////

   // Начинаем 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);
   curl_close($ch);

   // Отправляем команду авторизации пользователя и время доступа
   $data = json_encode(array('cmd' => 'authorize-guest', 'mac' => $id, 'minutes' => $minutes));
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_POST, TRUE);
   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);
   //curl_setopt($ch, CURLOPT_SSLVERSION, 3);
   curl_setopt($ch, CURLOPT_URL, $unifiServer . '/api/s/site/cmd/stamgr');
   curl_setopt($ch, CURLOPT_POSTFIELDS, 'json=' . $data);
   curl_exec($ch);
   curl_close($ch);

   // Выходим из системы
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_POST, TRUE);
   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);
   //curl_setopt($ch, CURLOPT_SSLVERSION, 1);
   curl_setopt($ch, CURLOPT_URL, $unifiServer . '/logout');
   curl_exec($ch);
   curl_close($ch);

   //sleep(8); // Небольшая пауза, чтобы контроллер успел авторизовать
   exit(header('Location: ' . $url));
   //$_SESSION['url']);
}
 
Этот новый PHP-код слегка изменён, чтобы учесть различия в контроллерах. Я не тестировал его на контроллере версии V3.x.x, так как у меня такого нет, но он должен работать; он также совместим с предыдущей версией, так что можно просто заменить старый код новым и получить тот же результат. В конструкторе появилась дополнительная опция — вы просто указываете версию контроллера в конце, и тогда будут изменены настройки curl для входа и версия SSL. Например:
$unifi = new unifiapi("username", "password", "https://0.0.0.0:8443", "default", "4.6.0");
$unifi->login();
$unifi->authorize_guest("mac address", 60)
 
В этой функции просто замените строку  
curl_setopt($ch, CURLOPT_SSLVERSION, 3);  
на  
curl_setopt($ch, CURLOPT_SSLVERSION, 6);  
Поскольку SSLv3 был заменён на TLS1.2, я заново скачаю оригинальные файлы, обновлю их и выложу здесь.
 
[РЕШЕНО] Я добавлял эту строку в неправильную функцию:
curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1');  

Всё, что нужно сделать, это изменить функцию  

private function get_curl_obj() {  
$ch = curl_init();  
curl_setopt($ch, CURLOPT_POST, TRUE);  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);  
//curl_setopt($ch, CURLOPT_SSLVERSION, 3); //МОЖНО УДАЛИТЬ ЭТУ СТРОКУ  
curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1'); //ДОБАВИТЬ ЭТУ  
curl_setopt($ch , CURLOPT_RETURNTRANSFER, true);  
if ($this->debug == true) {  
   curl_setopt($ch, CURLOPT_VERBOSE, TRUE);  
}  
if ($this->cookies != "") {  
   curl_setopt($ch, CURLOPT_COOKIE,  $this->cookies);  
}  
return $ch;  
}  

Вот так! Снова работает.
 
Единственное отличие между API версий 3.2.5 и 3.2.7, которое я могу увидеть здесь http://dl.ubnt.com/unifi/3.2.7/unifi_sh_api и здесь http://dl.ubnt.com/unifi/3.2.5/unifi_sh_api, это вот эта строка:  
3.2.5: curl_cmd="curl --sslv3 --silent --cookie ${cookie} --cookie-jar ${cookie} --insecure "  
3.2.7: curl_cmd="curl --tlsv1 --silent --cookie ${cookie} --cookie-jar ${cookie} --insecure "  

Я попробовал добавить это, но всё равно не работает:  
curl_setopt($ch, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1'); // также пробовал с TLSv1_1 и 1_2
 
Обратите внимание: «Функцию входа в классе unifiapi нужно подправить из-за новой версии контроллера 4.2.0», а не для 3.2.7! Я не пользовался 3.2.7 и могу только предположить, что она основана на той же базе, что и 3.2.5, которая работала с оригинальным API.
 
Обновление с версии 3.2.5 до 3.2.7 сломало PHP API. Я сделал изменения, о которых говорилось в предыдущем сообщении, но это не работает.
 
Функция входа в класс unifiapi требует небольшого изменения для нового контроллера 4.2.0. Примерно строки 33 и 34:  
from  
curl_setopt($ch, CURLOPT_URL, $this->baseurl."/login");  
curl_setopt($ch, CURLOPT_POSTFIELDS,"login=login&username=".$this->user."&password=".$this->password);  
to  
curl_setopt($ch, CURLOPT_URL, $this->baseurl."/api/login");  
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode(array("username" => $this->user, "password" => $this->password)).":");  

и примерно строка 45:  
from  
if (strlen($body) < 10) {  
to  
if (!empty($body)) {
 
Спасибо за это, будет просто отлично для нашей последней разработки 😀
 
Это просто замечательно, очень помогает. Я думал сделать то же самое для версии 2.4.6 и попытаться выяснить, в чём будут отличия. Есть ли какие-то отличия в вызовах, кроме 'Site'?
 
Похоже, это то, что нужно, если вы хотите использовать свой PHP-сайт для авторизации с Unifi. Круто, спасибо, что поделились 😀
 
Чтобы не показаться глупым, не мог бы ты чуть подробнее объяснить, что делает этот php-файл? Спасибо!
 
Большое спасибо за это. Очень полезно.
Страницы: 1
Читают тему (гостей: 1)