主要设置鉴权服务器主机名(域名或ip均可以)和加粗鉴权服务器路径php
路由器会请求如下四个地址:html
http://认证服务器/路径/login
http://认证服务器/路径/auth
http://认证服务器/路径/ping
http://认证服务器/路径/portal
http://认证服务器/路径/gw_message.phpmysql
因此咱们须要每一个请求创建一个文件夹下一个index.phpsql
客户端首次链接wifi,浏览器请求将被重定向到login并携带参数数据库
login/?gw_address=路由器ip&gw_port=路由器wifidog的端口&gw_id=用户id&url=被重定向前用户浏览的地址segmentfault
(2013版本的wifidog参数多了mac)浏览器
而login/index.php须要作的就是验证经过后再重定向到网关:服务器
http://网关地址:网关端口/wifidog/auth?token=session
以后wifidog会启动一个线程周期性报告用户状态:post
/auth?stage=&ip=&mac=&token=&incoming=&outgoing=
/auth/index.php则须要返回是否让该用户继续上网,回复格式:Auth:状态码(0:拒绝, 1:验证经过)
验证成功后,路由器将请求/portal/?gw_id=%s
在/portal/index.php就能够写重定向到第一次请求的url参数或者重定向到自定义网址了
/ping/index.php的做用就是告诉路由器认证服务器尚未崩
/gw_message/index.php做用是当认证过程出现错误的时候,想用户显示错误信息
咱们将完成用户用帐号密码方式认证
/login/index.php
<?php //获取url传递过来的参数 parse_str($_SERVER['QUERY_STRING'], $parseUrl); //gw_address、gw_port、gw_id是必需参数,缺乏不能认证成功. if( !array_key_exists('gw_address', $parseUrl) || !array_key_exists('gw_port', $parseUrl) || !array_key_exists('gw_id', $parseUrl)){ exit; } //若是提交了帐号密码 if(isset($_POST['name']) && isset($_POST['password'])){ $username = $_POST['name']; $password = $_POST['password']; $db = new mysqli('localhost', 'root', '', 'test'); if(mysqli_connect_errno()){ echo mysqli_connect_error(); die; } $db->query("set names 'utf8'"); $result = $db->query("SELECT * FROM user WHERE username='{$username}' AND password='{$password}'"); if($result && $result->num_rows != 0){ //数据库验证成功 $token = ''; $pattern="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ"; for($i=0;$i<32;$i++) $token .= $pattern[ rand(0,35) ]; //把token放到数据库,用于后续验证(auth/index.php) $time = time(); $sql = "UPDATE user SET token='{$token}',logintime='{$time}'"; $db->query($sql); $db->close(); //登录成功,跳转到路由网管指定的页面. $url = "http://{$parseUrl['gw_address']}:{$parseUrl['gw_port']}/wifidog/auth?token={$token}"; header("Location: ".$url); }else{ //认证失败 //直接重定向本页 请求变成get $url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; header("Location: ".$url); } }else{ //get请求 //一个简单的表单页面 $html = <<< EOD <html> <head> <title>portal login</title> </head> <body> <form action="#" method="post"> username:<input type="text" name="username" /> password:<input type="password" name="password" /> <input type="submit" value="submit" /> </form> </body> </html> EOD; echo $html; }
/auth/?stage=%s&ip=%s&mac=%s&token=%s&incoming=%s&outgoing=%s
参数解释:
stage: 认证阶段,就logoin和counters两种
token: login页面下发的token
incoming: 下载流量
outgoing: 上传流量
/auth/index.php
<?php //获取url传递过来的参数 parse_str($_SERVER['QUERY_STRING'], $parseUrl); //须要多少参数用户可本身顶 if( !array_key_exists('token', $parseUrl) ){ //拒绝 echo "Auth:0"; exit; } $db = new mysqli('localhost', 'root', '', 'test'); $db->query("set names 'utf8'"); $token = $parseUrl['token']; $sql = "SELECT * FROM user WHERE token='{$token}'"; $result = $db->query($sql); if($result && $result->num_rows != 0){ //token匹配,验证经过 echo "Auth:1"; }else{ echo "Auth:0"; }
/ping/?gw_id=%s&sys_uptime=%lu&sys_memfree=%u&sys_load=%.2f&wifidog_uptime=%lu
wifidog会向认证服务器发送一些信息,来报告wifidog如今的状况,这些信息是经过Http协议发送的,如上的连接所示,参数大概如字面意思,没仔细研究过,而做为认证服务器,auth_server应回应一个"Pong"。
主要做用是路由确认认证服务器仍然存活,没有死机,另一个功能是认证服务器能够收集路由的负载等的信息。路由器会定时访问这个脚本,脚本必须回复Pong,不然将认为认证服务器失效而出错。
/ping/index.php
<?php echo "Pong"; ?>
portal/?gw_id=%s
在认证成功后,wifidog会将用户重定向至该页面。
/portal/index.php
<?php //认证前用户访问任意url,而后被重定向登陆页面,session记录的是这个“任意url”. $url = $_SESSION["url"];//若是login参数url保存到session中 //跳转到登录前页面. header("Location: ".$url);
gw_message.php?message=denied
gw_message.php?message=activate
gw_message.php?message=failed_validation
/gw_message.php
<?php $message = null; if(isset($_GET["message"])){ $message = $_GET["message"]; } echo $message; ?>
wifidog的认证流程是:
用户连上wifi,发起一个访问网站的请求,如:segmentfault.com
网关根据防火墙规则,将请求重定向本地(路由器的ip)的wifidog端口
wifidog重定向到认证服务器的认证页面
认证服务器返回登陆页面让用户填写
用户填写后请求认证
认证服务器根据用户提供数据肯定是否符合要求
若是符合要求,认证服务器将用户重定向路由器网关并携带token
网关向认证服务器肯定用户信息
若是符合要求,服务器返回用户登陆成功的页面
用户正常上网