1.首先簡單說說wifidog認證的過程
用戶端首次串連到wifi後,瀏覽器請求將會被重新導向到:
login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s
驗證通過後,用戶端被重新導向到網關,url格式如下:
http://網關地址:網關連接埠/wifidog/auth?token=xx,
wifidong會啟動一個線程周期性地報告每一個使用者的狀態資訊,並通過如下地址發送給證明伺服器:
auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=
證明伺服器根據該狀態資訊決定是否允許該使用者繼續串連,並回複網關,回複格式為:Auth:狀態代碼,
如: Auth:1
常用狀態代碼:
0:AUTH_DENIED,表示拒絕
1:AUTH_ALLOWED,驗證通過
驗證通過後,將重新導向到如下地址:
portal/?gw_id=%s
wifidog的ping協議:
wifidog通過ping協議將目前狀態資訊發送給證明伺服器,發送地址為:
http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu
證明伺服器須返回一個“ Pong ”作為回應。
具體php實現代碼如下
public function auth(){ //響應用戶端的定時認證,可在此處做各種統計、計費等等 /* wifidog 會通過這個介面傳遞串連用戶端的資訊,然後根據返回,對用戶端做開通、斷開等處理,具體傳回值可以看wifidog的文檔 wifidog主要提交如下參數 1.ip 2. mac 3. token(login頁面下發的token) 4.incoming 下載流量 5.outgoing 上傳流量 6.stage 認證階段,就兩種 login 和 counters */ $stage = $_GET['stage'] == 'counters'?'counters':'login'; if($stage == 'login') { //XXXX跳過login 階段的處理XXXX不能隨便跳過的 //預設返回 允許 echo "Auth: 1"; } else if($stage == 'counters') { //做一個簡單的流量判斷驗證,下載流量超值時,返回下線通知,否則保持線上 if(!empty($_GET['incoming']) and $_GET['incoming'] > 10000000) { echo "Auth: 0"; }else{ echo "Auth: 1\n"; } } else echo "Auth: 0"; //其他情況都返回拒絕 /* 傳回值:主要有這兩種就夠了 0 - 拒絕 1 - 允許存取 官方文檔如下 0 - AUTH_DENIED - User firewall users are deleted and the user removed. 6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted(使用者郵件驗證逾時,防火牆關閉該使用者) 1 - AUTH_ALLOWED - User was valid, add firewall rules if not present 5 - AUTH_VALIDATION - Permit user access to email to get validation email under default rules (使用者郵件驗證時,向使用者開放email) -1 - AUTH_ERROR - An error occurred during the validation process */}public function portal(){ /* wifidog 帶過來的參數 如下 1. gw_id */ //重定到指定網站 或者 顯示splash廣告頁面 redirect('http://www.baidu.com', 'location', 302);}public function ping(){ //url請求 "gw_id=$gw_id&sys_uptime=$sys_uptime&sys_memfree=$sys_memfree&sys_load=$sys_load&wifidog_uptime=$wifidog_uptime"; //log_message($this->config->item('MY_log_threshold'), __CLASS__.':'.__FUNCTION__.':'.debug_printarray($_GET)); //判斷各種參數是否為空白 if( !(isset($_GET['gw_id']) and isset($_GET['sys_uptime']) and isset($_GET['sys_memfree']) and isset($_GET['sys_load']) and isset($_GET['wifidog_uptime']) ) ) { echo '{"error":"2"}'; return; } //添加心跳Tlog功能 /* 此處可擷取 wififog提供的 如下參數 1.gw_id 來自wifidog 設定檔中,用來區分不同的路由裝置 2.sys_uptime 路由器的系統啟動時間 3.sys_memfree 系統記憶體使用量百分比 4.wifidog_uptime wifidog持續已耗用時間(這個資料經常會有問題) */ //傳回值 echo 'Pong';}/** * wifidog 的gw_message 介面,資訊提示頁面*/function gw_message(){ if (isset($_REQUEST["message"])) { switch ($_REQUEST["message"]) { case 'failed_validation': //auth的stage為login時,被伺服器返回AUTH_VALIDATION_FAILED時,來到該處處理 //認證失敗,請重新認證 break; case 'denied': //auth的stage為login時,被伺服器返回AUTH_DENIED時,來到該處處理 //認證被拒 break; case 'activate': //auth的stage為login時,被伺服器返回AUTH_VALIDATION時,來到該處處理 //待啟用 break; default: break; } }else{ //不回顯任何資訊 }}