외부 포털 서버 구축 시 요구 사항(Omada 컨트롤러 2.6.0 이상)

기능 설명 또는 사양 매개 변수와 관련된 Q&A
수정일10-22-2021 03:15:39 AM 60365
본 내용은 다음 항목에 적용됩니다: 

Omada 컨트롤러 2.6.0 또는 그 이상이어야 합니다 

만일 사용 중인 Omada 컨트롤러 버전이 2.6.0 보다 낮은 경우 FAQ 928를 참고하세요 

만일 사용 중인 Omada 컨트롤러 버전이 4.1.5 보다 높은 경우 FAQ 2907를 참고하세요 

본문은 외부 포털 서버 구축 시 요구 사항에 대한 정보를 다룹니다. 외부 포털 서버를 구성하는 방법이 궁금한 경우, FAQ-896(섹션 5의 2 단계)를 참고하세요. 

아래 이미지는 외부 포털 서버 구축 시 요구 사항에 대한 이해를 돕기 위해 무선 클라이언트, EAP 장치, Omada 컨트롤러, 포털 서버 그리고 인증 서버 사이에서의 데이터 흐름(flow)을 묘사한 것입니다. 

 

1. 무선 클라이언트는 포털 인증이 활성화된 SSID에 연결되어 인터넷에 접속을 시도합니다. EAP 장치는 클라이언트의 HTTP 요청을 차단하고 Omada 컨트롤러로 리디렉트할 것입니다. 그런 다음 클라이언트는 EAP에서 수신한 HTTP 응답에 따라 URL에 쿼리 문자열(string) "cid=client_mac&ap=ap_mac&ssid=ssid_name&t=time_since_epoch&rid=Radio_id"가 포함된 GET 요청을 Omada 컨트롤러에 보냅니다. (1단계 및 2단계) 

2. Omada 컨트롤러는 클라이언트에 상태 코드 302 Found가 포함된 HTTP 응답에 응하며 이제 클라이언트를 외부 포털 서버로 리디렉트 합니다. 302 Found 코드의 HTTTP 응답은 위치 필드의 외부 포터 서버에 URL을 제공합니다. URL은 쿼리 문자열(string) 또한 포함합니다. Omada 컨트롤러 2.6.0 또는 그 이상의 URL은 http://portal_server_ip?cid=client_mac&ap=ap_mac&ssid=ssid_name&t=time_since_epoch&rid=Radio_id&site=site_name입니다. (3단계 및 4단계)

매개변수의 의미는 표 1 매개변수 설명에 나열되어 있습니다.

 

3. 클라이언트가 위의 언급된 URL을 사용하여 외부 포터 서버에 GET 요청을 보냅니다. (5단계)

4. 외부 포털 서버는 GET 요청의 쿼리 문자열(string)에 있는 매개변수 값을 차단하고 기억할 수 있어야 하며 인증 양식이 포함된 웹 페이지를 무선 클라이언트에 반환할 수 있어야 합니다. (6 단계)

5. 무선 클라이언트의 인증 정보가 포털 서버로 제출되면 포털 서버가 이 정보를 인증 서버에 제출합니다. (7 단계 및 8 단계) 

하지만, 포털 서버가 어떻게 클라이언트 인증 정보를 얻는지, 포털 서버가 인증 서버와 통신하는지에 대한 것은 본문의 범위를 벗어나 자체 구현에 따릅니다.  

6. 인증 서버는 인증 정보를 확인하고 결과를 포털 서버에 반환합니다. (9 단계)

 

참고: 해당 예시에서 포털 서버와 인증 서버는 각각 다릅니다. 하지만 사용자가 원한다면 한 개의 서버에 설치할 수 있습니다. 인증 방식 또한 사용자가 선택할 수 있습니다. 단, 인증에 통과될 때 서버가 이를 알아야 합니다. 

 

7. 인증이 성공하면 포털 서버는 Omada 컨트롤러의 API를 호출하여 클라이언트 정보를 Omada 컨트롤러로 보내야 합니다. 먼저 POST 요청을 전송하여 Omada 컨트롤러에 로그인해야 합니다. 요청의 URL은 https://controller_server_ip:https_port/login이 되며 HTTP 메시지 본문에 JSON 형식을 사용하여 "name=the_username_of_controller&password=the_password_of_controller" 데이터를 전달합니다.

예를 들어,

private static function login()

      {

$ch = curl_init();

// post

curl_setopt($ch, CURLOPT_POST, TRUE);

// Set return to a value, not return to page [페이지로 돌아가지 않고 값으로 반환 설정]

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Set up cookies [쿠키 설정]

curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE_FILE_PATH);

curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE_FILE_PATH);

// Allow Self Signed Certs [자체 서명 인증서 허용]

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

// API Call [API 호출]

curl_setopt($ch, CURLOPT_URL, CONTROLLER_SERVER . "/login");

curl_setopt($ch, CURLOPT_POSTFIELDS, "name=" . CONTROLLER_USER ."&password=" . CONTROLLER_PASSWORD);

     $res = curl_exec($ch);

     $resObj = json_decode($res);

     // Prevent CSRF [CSRF 방지]

          if($resObj->success == true){

                           self::setCSRFToken($resObj->value);

                }

      curl_close($ch);

      }

          private static function setCSRFToken($token){

                     $myfile = fopen(TOKEN_FILE_PATH, "w") or die("Unable to open file!");

                     fwrite($myfile, $token);

                     fclose($myfile);

                  

                     return $token;

                }

(10 단계)

 

8. 포털 서버가 컨트롤러에 성공적으로 로그인하면 POST 메서드를 사용하여 클라이언트 정보를 https://controller_server_ip:https_port/extportal/site_name/auth?token=CSRFToken으로 보냅니다. 정보 데이터는 JSON 포맷으로 나타낼 수 있으며 이러한 매개변수 "cid=client_mac&ap=ap_mac&ssid=ssid_name&t=time_since_epoch&rid=Radio_id&site=site_name&time=expire_time"를 포함해야 합니다.

 

예를 들어,

private static function authorize($cid,$ap,$ssid,$rid,$t,$seconds,$site)

{

     // Send user to authorize and the time allowed [사용자에게 권한 부여 및 허용 시간 전송]

$authInfo = array(

'cid' => $cid,

'ap' => $ap,

'ssid' => $ssid,

'rid' => $rid,

't' => $t,

'time' => $seconds

);

$ch = curl_init();

// post

curl_setopt($ch, CURLOPT_POST, TRUE);

// Set return to a value, not return to page [페이지로 돌아가지 않고 값으로 반환 설정]

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Set up cookies [쿠키 설정]

curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE_FILE_PATH);

curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE_FILE_PATH);

// Allow Self Signed Certs [자체 서명 인증서 허용]    

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

// API Call [API 호출]

$csrfToken = self::getCSRFToken();

curl_setopt($ch, CURLOPT_URL, CONTROLLER_SERVER ."/extportal/". $site."/auth"."?token=".$csrfToken);

$data = json_encode($authInfo);

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($authInfo));

 

$res = curl_exec($ch);

$resObj = self::resultConvert($res);

if($resObj['success'] == false){

echo $res;

 

}

curl_close($ch);

}

 

private static function resultConvert($json)

{       

$json = str_replace(array('{','}',':',','),array('[{" ',' }]','":',',"'),$json);

function cb_quote($v)

    {

    return '"'.trim($v[1]).'"';

    }

$newJSON=preg_replace_callback("~\"(.*?)\"~","cb_quote", $json);

$res = json_decode($newJSON, true)[0];

return $res;

}

private static function getCSRFToken(){

          $myfile = fopen(TOKEN_FILE_PATH, "r") or die("Unable to open file!");

          $token = fgets($myfile);

          fclose($myfile);

                  

          return $token;

}

 

(11 단계)

위의 매개변수의 뜻은 표 1의 매개변수 설명과 동일합니다. 여기에 시간 매개변수는 클라이언트 인증이 만기 되기 전 초를 나타냅니다. 해당 매개변수는 포털 서버에 의해 정의됩니다. 

 

9. Omada 컨트롤러는 HTTP POST 요청에 제공된 정보를 처리한 후 포털 서버에 JSON 메세지 {"success": [true/false], "message":" return information"}를 반환합니다. 포털 서버가 JSON 메세지를 다루는 방식은 사용자의 구현 방식에 따라 달라집니다. 마지막으로 포털 서버는 https://controller_server_ip:https_port/logout?token=CSRFToken에 POST 요청을 보내 Omada 컨트롤러를 로그아웃해야 합니다.

예를 들어,

private static function logout()

      { 

$ch = curl_init();

// Post

curl_setopt($ch, CURLOPT_POST, TRUE);

// Set return to a value, not return to page [페이지로 돌아가지 않고 값으로 반환 설정]

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Set up cookies [쿠키 설정]

curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE_FILE_PATH);

curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE_FILE_PATH);

// Allow Self Signed Certs [자체 서명 인증서 허용]

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

// API Call [API 호출]

$csrfToken = self::getCSRFToken();

     curl_setopt($ch, CURLOPT_URL, CONTROLLER_SERVER . "/logout"."?token=".$csrfToken);

           curl_exec($ch);

curl_close($ch);

}

(12 단계 및 13 단계)

 

 

TOKEN_FILE_PATH는 로그인 요청에서 반환된 CSRFToken을 저장하는 파일이며 사용자가 직접 구성할 수 있습니다.

 

참고: API를 성공적으로 호출하려면 다음 두 가지 사항을 달성하도록 포털 서버를 구성해야 합니다.

1. 자체 서명된 인증서를 허용합니다.

2. 서버 https 패킷을 읽고 TPEAP_SESSIONID를 쿠키에 저장하고 나중에 이 쿠키로 요청합니다.

더 알아보기

해당 FAQ가 유용했나요?

여러분의 의견은 사이트 개선을 위해 소중하게 사용됩니다.

From United States?

해당 지역의 제품, 이벤트 및 서비스를 받아보세요.