WIFIdog 簡單說就是用戶在wifi環(huán)境下使用wifi交互登陸的方法
Wifidog Portal認(rèn)證示例PHP腳本
wifi 路由推薦使用海蜘蛛 3.3 wifi營銷固件
這里路由簡稱 AP
驗(yàn)證服務(wù)器簡稱 AUTH SERVSER
AP 請求是使用$_GET 方法傳遞數(shù)據(jù)給AUTH SERVSER
請求參數(shù)
下面的參數(shù)獲取為簡寫
$stage = isset($_GET["stage"]) ? $_GET["stage"] : null;
$ip = isset($_GET["ip"]) ? $_GET["ip"] : null;
$mac = isset($_GET["mac"]) ? $_GET["mac"] : null;
$token = isset($_GET["token"]) ? $_GET["token"] : null;
$incoming = isset($_GET["incoming"]) ? $_GET["incoming"] : null;
$outgoing = isset($_GET["outgoing"]) ? $_GET["outgoing"] : null;
$gw_id = isset($_GET["gw_id"]) ? $_GET["gw_id"] : null;
實(shí)例
先介紹數(shù)據(jù)庫的結(jié)構(gòu)本鸣,我構(gòu)建的數(shù)據(jù)庫名是portal,表名是User,用于記錄等錄用用戶的用戶名坟乾、密碼等的信息:
create database portal;
CREATE TABLE `User` (
`Username` varchar(255) NOT NULL,
`Password` text NOT NULL,
`Token` text,
`LoginTime` datetime DEFAULT NULL,
`Gw_address` text,
`Gw_port` text,
`Gw_id` text,
`Mac` text,
`Url` text,
PRIMARY KEY (`Username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
首先介紹的是登陸腳本傲隶,即上一篇文章介紹的LoginScriptPathFragment配置項(xiàng)配置的腳本(詳細(xì)介紹見上一篇文章)遂赠。
auth.php艾少,主要用于認(rèn)證服務(wù)器驗(yàn)證路由網(wǎng)關(guān)提交的token疚漆。
//首先獲取URL傳遞過來的參數(shù)副渴,包括stage奈附、ip、mac煮剧、token斥滤、incoming、outgoing和gw_id.
$stage = isset($_GET["stage"]) ? $_GET["stage"] : null;
$ip = isset($_GET["ip"]) ? $_GET["ip"] : null;
$mac = isset($_GET["mac"]) ? $_GET["mac"] : null;
$token = isset($_GET["token"]) ? $_GET["token"] : null;
$incoming = isset($_GET["incoming"]) ? $_GET["incoming"] : null;
$outgoing = isset($_GET["outgoing"]) ? $_GET["outgoing"] : null;
$gw_id = isset($_GET["gw_id"]) ? $_GET["gw_id"] : null;
//mac和token是必需參數(shù)勉盅,不能為空佑颇,只有mac和token均不為空才有可能通過驗(yàn)證,缺失參數(shù)將不顯示登錄表單.
if(!empty($mac) && !empty($token)){
//mysql連接草娜,相應(yīng)的參數(shù)mysql_host挑胸、mysql_user和mysql_password需要換成你自己的參數(shù).
$con = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’);
//數(shù)據(jù)庫連接失敗,驗(yàn)證不通過.
if(!$con){
echo "Auth: 0";
}
else{
//選擇mysql數(shù)據(jù)庫宰闰,如果你的數(shù)據(jù)庫名不是portal茬贵,請自行更改.
mysql_select_db(‘portal’, $con);
//用戶登陸成功后簿透,會把用戶的參數(shù)(ip、mac和系統(tǒng)自動生成的token等)記錄到數(shù)據(jù)庫闷沥,系統(tǒng)主要通過mac識別用戶萎战,當(dāng)然這種方式在大規(guī)模系統(tǒng)中可能存在漏洞.
$result = mysql_query("SELECT * FROM User WHERE Mac='".$mac."' AND Token='".$token."'");
//如果token匹配,驗(yàn)證通過舆逃,否則驗(yàn)證失敗.
if(!empty($result) && mysql_num_rows($result) != 0){
echo "Auth: 1";
}
else{
echo "Auth: 0";
}
}
}
else{
echo "Auth: 0";
}
?>
接下來介紹的是登陸成功腳本蚂维,即上文介紹的PortalScriptPathFragment配置項(xiàng)配置的腳本(詳細(xì)介紹見上一篇文章)。
portal.php路狮,主要作用是告知用戶登錄成功虫啥,并跳轉(zhuǎn)用戶登錄前訪問的頁面。
//告知用戶登陸成功.
echo ‘登錄成功’;
//認(rèn)證前用戶訪問任意url奄妨,然后被重定向登錄頁面涂籽,session記錄的是這個“任意url”.
$url = $_SESSION["url"];
//跳轉(zhuǎn)到登陸前頁面.
header("Location: ".$url);
?>
當(dāng)然,這個腳本沒有任何界面砸抛,為提升用戶體驗(yàn)评雌,你可以設(shè)計一個好的界面,顯示登陸成功信息直焙。
接下來介紹的是錯誤信息展示腳本景东,即上文介紹的MsgScriptPathFragment配置項(xiàng)配置的腳本,(詳細(xì)介紹見上一篇文章)奔誓。
gw_message.php斤吐,主要作用是當(dāng)認(rèn)證過程出現(xiàn)錯誤的時候,向用戶顯示用戶信息厨喂。
$message = null;
if(isset($_GET["message"])){
$message = $_GET["message"];
}
echo $message;
?>
腳本非常簡單和措,錯誤信息就在message參數(shù)中,告知用戶即可蜕煌。當(dāng)然這個錯誤信息是英文的派阱,如有需要,可以做做翻譯幌绍,以提升用戶體驗(yàn)颁褂。這個腳本同樣沒有任何界面,需自行設(shè)計傀广。
接下來介紹的是心跳腳本颁独,即上文介紹的PingScriptPathFragment配置項(xiàng)配置的腳本,(詳細(xì)介紹見上一篇文章)伪冰。
ping.php誓酒,其主要作用是路由確認(rèn)認(rèn)證服務(wù)器仍然存活,沒有死機(jī),另外一個功能是認(rèn)證服務(wù)器可以收集路由的負(fù)載等的信息靠柑。路由器會定時訪問這個腳本寨辩,腳本必須回復(fù)Pong,否則將認(rèn)為認(rèn)證服務(wù)器失效而出錯歼冰。
echo ‘Pong’;
?>
最后介紹的是登陸腳本靡狞,即上文介紹的AuthScriptPathFragment配置項(xiàng)配置的腳本,(詳細(xì)介紹見上一篇文章)隔嫡。
login.php甸怕,主要作用是顯示登錄界面,用戶登陸成功后腮恩,跳轉(zhuǎn)到路由器網(wǎng)關(guān)的特定接口梢杭。
//獲取url傳遞過來的參數(shù)
$gw_address = isset($_GET["gw_address"]) ? $_GET["gw_address"] : null;
$gw_port = isset($_GET["gw_port"]) ? $_GET["gw_port"] : null;
$gw_id = isset($_GET["gw_id"]) ? $_GET["gw_id"] : null;
$mac = isset(isset($_GET["mac"]) ? isset($_GET["mac"] : null;
$url = isset($_GET["url"]) ? $_GET["url"] : null;
//gw_address、gw_port秸滴、gw_id和mac是必需參數(shù)武契,缺少不能認(rèn)證成功.
if(!empty($gw_address) && !empty($gw_port) && !empty($gw_id) && !empty($mac)){
//參數(shù)初始化
$post_username = null;
$post_password = null;
$error_message = null;
//如果用戶提交用戶名和密碼,進(jìn)行驗(yàn)證
if(isset($_POST["username"]) && isset($_POST["password"])){
$post_username = $_POST["username"];
$post_password = $_POST["password"];
//mysql數(shù)據(jù)庫連接荡含,相應(yīng)的參數(shù)mysql_host咒唆、mysql_user和mysql_password需要換成你自己的參數(shù).
$con = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’);
//數(shù)據(jù)庫連接失敗,展示錯誤信息
if(!$con){
$error_message = "數(shù)據(jù)庫連接錯誤!".mysql_error();
//login_view.php展示的是登陸表單(下文介紹)释液,如有錯誤钧排,展示錯誤信息.
include("login_view.php");
}
else{
//選擇mysql數(shù)據(jù)庫,如果你的數(shù)據(jù)庫名不是portal均澳,請自行更改.
mysql_select_db(‘portal’, $con);
//用戶名和密碼驗(yàn)證.
$result = mysql_query("SELECT * FROM User WHERE Username='".$post_username."' AND Password='".$post_password."'");
if(!empty($result) && mysql_num_rows($result) != 0){
//用戶名和密碼驗(yàn)證成功,生成隨機(jī)token.
$token = "";
$pattern="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ";
for($i=0;$i<32;$i++){
$token .= $pattern{mt_rand(0,35)};
}
//把token等參數(shù)寫入數(shù)據(jù)庫符衔,已被用于后續(xù)驗(yàn)證(上文提到的auth.php).
mysql_query("Update User SET Token='".$token."', LoginTime='".date("Y-m-d H:i:s")."', Gw_address='".$gw_address."', Gw_port='".$gw_port."', Gw_id='".$gw_id."', Mac='".$mac."', Url='".$url."' WHERE Username='".$post_username."'");
$error_message = mysql_error();
//把用戶名和url存進(jìn)session找前,以備后續(xù)使用.
session_start();
$_SESSION['username'] = $post_username;
$_SESSION['url'] = $url;
//登陸成功,跳轉(zhuǎn)到路由網(wǎng)管指定的頁面.
header("Location: http://".$gw_address.":".$gw_port."/wifidog/auth?token=".$token);
}
else{
//登錄失敗判族,顯示錯誤信息.
$error_message = "用戶名或密碼錯誤躺盛!";
include("login_view.php");
}
}
}
else{
include("login_view.php");
}
}
?>
Login_view.php登陸表單。
Portal Login
">
Username
Password
本文由http://www.wifidog.pro/2015/02/06/wifidog%E5%88%86%E6%9E%90-1.html?整理編輯形帮,轉(zhuǎn)載請注明出處