1.首先簡單說說wifidog認證的過程
客戶端首次連接到wifi后毁枯,瀏覽器請求將會被重定向到:
login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s
驗證通過后暖释,客戶端被重定向到網(wǎng)關,url格式如下:
http://網(wǎng)關地址:網(wǎng)關端口/wifidog/auth?token=
wifidong會啟動一個線程周期性地報告每一個用戶的狀態(tài)信息抄伍,并通過如下地址發(fā)送給認證
服務器:
auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=
認證服務器根據(jù)該狀態(tài)信息決定是否允許該用戶繼續(xù)連接,并回復網(wǎng)關,回復格式為:Auth:狀態(tài)碼骚腥,
如:Auth:1
常用狀態(tài)碼:
0:AUTH_DENIED,表示拒絕
1:AUTH_ALLOWED瓶逃,驗證通過
驗證通過后束铭,將重定向到如下地址:
portal/?gw_id=%s
wifidog的ping協(xié)議
wifidog通過ping協(xié)議將當前狀態(tài)信息發(fā)送給認證服務器,發(fā)送地址為:
http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu
認證服務器須返回一個“Pong”作為回應厢绝。
2.具體php實現(xiàn)代碼如下
public function auth()
{
? //響應客戶端的定時認證契沫,可在此處做各種統(tǒng)計、計費等等
? /*
? ? ? wifidog 會通過這個接口傳遞連接客戶端的信息昔汉,然后根據(jù)返回懈万,對客戶端做開通、斷開等處理靶病,具體返回值可以看wifidog的文檔
? wifidog主要提交如下參數(shù)
? 1.ip
? 2. mac
? 3. token(login頁面下發(fā)的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 帶過來的參數(shù) 如下
? 1. gw_id
? */
? //重定到指定網(wǎng)站 或者 顯示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));
? //判斷各種參數(shù)是否為空
? 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;
? }
? //添加心跳日志處理功能
? /*
? ? ? 此處可獲取 wififog提供的 如下參數(shù)
? 1.gw_id? 來自wifidog 配置文件中裳涛,用來區(qū)分不同的路由設備
? 2.sys_uptime 路由器的系統(tǒng)啟動時間
? 3.sys_memfree 系統(tǒng)內(nèi)存使用百分比
? 4.wifidog_uptime wifidog持續(xù)運行時間(這個數(shù)據(jù)經(jīng)常會有問題)
? */
? //返回值
? 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{
? ? ? //不回顯任何信息
? }
}
本文由http://www.wifidog.pro/2015/01/28/wifidog-php-1.html整理編輯虚婿,轉載請注明出處