Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1
RSS
Внешний Captive Portal V5.0.7, UniFi Network
 
Привет, ребята, я совсем новичок во всём этом и очень нуждаюсь в помощи, если это возможно. Мой начальник хочет, чтобы я в итоге создал внешний captive portal, который будет требовать от гостей войти через их Facebook (только вход), чтобы подключиться к гостевой сети. Но сейчас я даже не могу заставить работать самый простой внешний captive portal.

Вот немного информации о настройке, надеюсь, кто-то сможет понять, в чём проблема:
- Контроллер установлен (как я понимаю) на сервере в нашем офисе в Гонконге
- Внешний сервер, который я использую — Ubuntu 14.04, размещённый на AWS EC2 в США
- На Ubuntu установлены все необходимые инструменты (по моим предположениям): apache, curl, php (если что-то забыл, скажите)
- IP внешнего сервера уже добавлен в предавторизованный доступ как: XX.XX.XX.XXX/32

Базовый код, с которым я работаю, взят отсюда: https://community.ui.com/questions/0b4ea2a1-d8d5-42d4-a0b0-56cf845bfd1d

Я также внес некоторые изменения согласно этому посту: http://community.ubnt.com/t5/UniFi-Wireless/PHP-Portal-Authorisation-Example-on-V4/td-p/1167305  
Но эти ссылки уже старые и, скорее всего, устаревшие, так как они для версий 4.X или раньше.

Я ещё сделал небольшие правки в коде, основываясь на разных сообщениях с форума, сейчас мой код выглядит так:

authorized.php
<?php
session_start();

function sendAuthorization($id, $minutes, $ap) {
   $unifiServer = "https://unificontrollerserver:8443";
   $unifiUser = "xxxxx";
   $unifiPass = "xxxxxx";

   // Запуск 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, 1);
   // Логинимся на UniFi контроллере
   curl_setopt($ch, CURLOPT_URL, '$unifiServer/api/login');

   $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,
       'ap_mac' => $ap,
       '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'] == "unique key") { // Проверяем, отправлена ли форма
   ob_start();
   sendAuthorization($_SESSION['id'], (12*60), $_SESSION['ap'] ); // авторизуем пользователя на 12 часов
   ob_end_clean();
   unset($_SESSION['loggingin']);
}
?>

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

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

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

$_SESSION['id'] = $_GET['id']; // MAC адрес пользователя
$_SESSION['ap'] = $_GET['ap']; // MAC адрес точки доступа
$_SESSION['ssid'] = $_GET['ssid']; // SSID, к которому пытается подключиться пользователь (POST 2.3.2)
$_SESSION['time'] = $_GET['t']; // Время запроса порталу
$_SESSION['refURL'] = $_GET['url']; // URL, к которому пытался получить доступ пользователь
$_SESSION['loggingin'] = "unique key"; // ключ для проверки, использовал ли пользователь этот форму, чтобы предотвратить переход напрямую на 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>

После нажатия кнопки "Подключиться" и появления сообщения "подключение к сети", меня перенаправляет обратно на страницу с кнопкой. И этот цикл повторяется бесконечно, доступа к интернету так и нет. Полагаю, пользователь так и не проходит аутентификацию, отсюда и бесконечный цикл. Но я не знаю, как это исправить.

Не уверен, связано ли это, но я проверял http://www.yougetsignal.com/tools/open-ports/, открыт ли порт 8443 на внешнем сервере. Там написано, что он закрыт, но открыты порты 22 и 80. При этом firewall на Ubuntu я вообще не включал.

Буду очень благодарен за любую помощь!!!
 
У меня такая же проблема, как и у тебя.  
@adelaosa  
Ты уже решил(а) её?
 
Файл index.php находится в вашей папке www — это путь, который на него перенаправляет: /var/www/html/guest/s/Sitename на Ubuntu. Надеюсь, это поможет. Спасибо.
 
Всем привет, я использую тот же портал на PHP, но пока не понимаю, куда именно нужно положить index.php и authorize.php, чтобы после подключения с телефона меня перенаправляло на этот портал. Я использую UniFi версии 5.4.14. Спасибо!
 
Тебе удалось заставить это работать с версией 5.3.8? https://community.ui.com/releases/c888004a-ca02-42c4-8cc6-ce158888b882  
У меня доходит до «Connection Successful», меня зацикливает на Google.com, но страница входа так и не исчезает.  
Я понял, в чем была проблема с API. Если у тебя больше одного сайта или если по умолчанию в authorize.php не используется основной сайт, нужно изменить логин в Authorize.PHP:  
// Make the API Call  
curl_setopt($ch, CURLOPT_URL, $unifi['unifiServer'].'/api/s/default/cmd/stamgr');

У меня выглядит так:  
// Make the API Call  
curl_setopt($ch, CURLOPT_URL, $unifi['unifiServer'].'/api/s/0z7yxufk/cmd/stamgr');

Имя сайта можно узнать в портале.
 
Я столкнулся с точно такой же проблемой! В одном из ссылок, которые ты выложил (https://community.ui.com/questions/0b4ea2a1-d8d5-42d4-a0b0-56cf845bfd1d), есть решение, которое я адаптировал под твой код и протестировал. Замени последний "if" перед частью скрипта, отвечающей за редирект на authorize.php, вот на это:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 // Если форма отправлена, пропускаем пользователя дальше.
 ob_start();
 sendAuthorization($_SESSION['id'], '480', $unifi, $_SESSION['ap']);
 ob_end_clean();
 unset($_SESSION['loggingin']);
}
Страницы: 1
Читают тему (гостей: 1)