WIFIdog 簡單說就是用戶在wifi環境下使用wifi交互登陸的方法
Wifidog Portal認證示例PHP腳本
wifi 路由推薦使用海蜘蛛 3.3 wifi營銷固件
這里路由簡稱 AP
驗證服務器簡稱 AUTH SERVSER
AP 請求是使用$_GET 方法傳遞數據給AUTH SERVSER
請求參數
下面的參數獲取為簡寫
$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;
實例
先介紹數據庫的結構,我構建的數據庫名是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配置項配置的腳本(詳細介紹見上一篇文章)。
auth.php,主要用于認證服務器驗證路由網關提交的token。
//首先獲取URL傳遞過來的參數,包括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是必需參數,不能為空,只有mac和token均不為空才有可能通過驗證,缺失參數將不顯示登錄表單.
if(!empty($mac) && !empty($token)){
//mysql連接,相應的參數mysql_host、mysql_user和mysql_password需要換成你自己的參數.
$con = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’);
//數據庫連接失敗,驗證不通過.
if(!$con){
echo "Auth: 0";
}
else{
//選擇mysql數據庫,如果你的數據庫名不是portal,請自行更改.
mysql_select_db(‘portal’, $con);
//用戶登陸成功后,會把用戶的參數(ip、mac和系統自動生成的token等)記錄到數據庫,系統主要通過mac識別用戶,當然這種方式在大規模系統中可能存在漏洞.
$result = mysql_query("SELECT * FROM User WHERE Mac='".$mac."' AND Token='".$token."'");
//如果token匹配,驗證通過,否則驗證失敗.
if(!empty($result) && mysql_num_rows($result) != 0){
echo "Auth: 1";
}
else{
echo "Auth: 0";
}
}
}
else{
echo "Auth: 0";
}
?>
接下來介紹的是登陸成功腳本,即上文介紹的PortalScriptPathFragment配置項配置的腳本(詳細介紹見上一篇文章)。
portal.php,主要作用是告知用戶登錄成功,并跳轉用戶登錄前訪問的頁面。
//告知用戶登陸成功.
echo ‘登錄成功’;
//認證前用戶訪問任意url,然后被重定向登錄頁面,session記錄的是這個“任意url”.
$url = $_SESSION["url"];
//跳轉到登陸前頁面.
header("Location: ".$url);
?>
當然,這個腳本沒有任何界面,為提升用戶體驗,你可以設計一個好的界面,顯示登陸成功信息。
接下來介紹的是錯誤信息展示腳本,即上文介紹的MsgScriptPathFragment配置項配置的腳本,(詳細介紹見上一篇文章)。
gw_message.php,主要作用是當認證過程出現錯誤的時候,向用戶顯示用戶信息。
$message = null;
if(isset($_GET["message"])){
$message = $_GET["message"];
}
echo $message;
?>
腳本非常簡單,錯誤信息就在message參數中,告知用戶即可。當然這個錯誤信息是英文的,如有需要,可以做做翻譯,以提升用戶體驗。這個腳本同樣沒有任何界面,需自行設計。
接下來介紹的是心跳腳本,即上文介紹的PingScriptPathFragment配置項配置的腳本,(詳細介紹見上一篇文章)。
ping.php,其主要作用是路由確認認證服務器仍然存活,沒有死機,另外一個功能是認證服務器可以收集路由的負載等的信息。路由器會定時訪問這個腳本,腳本必須回復Pong,否則將認為認證服務器失效而出錯。
echo ‘Pong’;
?>
最后介紹的是登陸腳本,即上文介紹的AuthScriptPathFragment配置項配置的腳本,(詳細介紹見上一篇文章)。
login.php,主要作用是顯示登錄界面,用戶登陸成功后,跳轉到路由器網關的特定接口。
//獲取url傳遞過來的參數
$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是必需參數,缺少不能認證成功.
if(!empty($gw_address) && !empty($gw_port) && !empty($gw_id) && !empty($mac)){
//參數初始化
$post_username = null;
$post_password = null;
$error_message = null;
//如果用戶提交用戶名和密碼,進行驗證
if(isset($_POST["username"]) && isset($_POST["password"])){
$post_username = $_POST["username"];
$post_password = $_POST["password"];
//mysql數據庫連接,相應的參數mysql_host、mysql_user和mysql_password需要換成你自己的參數.
$con = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’);
//數據庫連接失敗,展示錯誤信息
if(!$con){
$error_message = "數據庫連接錯誤!".mysql_error();
//login_view.php展示的是登陸表單(下文介紹),如有錯誤,展示錯誤信息.
include("login_view.php");
}
else{
//選擇mysql數據庫,如果你的數據庫名不是portal,請自行更改.
mysql_select_db(‘portal’, $con);
//用戶名和密碼驗證.
$result = mysql_query("SELECT * FROM User WHERE Username='".$post_username."' AND Password='".$post_password."'");
if(!empty($result) && mysql_num_rows($result) != 0){
//用戶名和密碼驗證成功,生成隨機token.
$token = "";
$pattern="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ";
for($i=0;$i<32;$i++){
$token .= $pattern{mt_rand(0,35)};
}
//把token等參數寫入數據庫,已被用于后續驗證(上文提到的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存進session,以備后續使用.
session_start();
$_SESSION['username'] = $post_username;
$_SESSION['url'] = $url;
//登陸成功,跳轉到路由網管指定的頁面.
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?整理編輯,轉載請注明出處