java wifidog_用php写wifidog的认证服务器

路由器上wifidog的设置

f189b785c1ae99df6859696f8bf1a447.png

主要设置鉴权服务器主机名(域名或ip都可以)和加粗鉴权服务器路径

路由器会请求以下四个地址:

http://认证服务器/路径/login

http://认证服务器/路径/auth

http://认证服务器/路径/ping

http://认证服务器/路径/portal

http://认证服务器/路径/gw_message.php

所以我们需要每个请求建立一个文件夹下一个index.php

预备知识

客户端首次连接wifi,浏览器请求将被重定向到login并携带参数

login/?gw_address=路由器ip&gw_port=路由器wifidog的端口&gw_id=用户id&url=被重定向前用户浏览的地址

(2013版本的wifidog参数多了mac)

而login/index.php需要做的就是验证通过后再重定向到网关:

http://网关地址:网关端口/wifidog/auth?token=

之后wifidog会启动一个线程周期性报告用户状态:

/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作用是当认证过程出现错误的时候,想用户显示错误信息

开工

我们将完成用户用账号密码方式认证

1.首次重定向:

/login/index.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

portal login

username:

password:

EOD;

echo $html;

}

2.用户认证协议:

/auth/?stage=%s&ip=%s&mac=%s&token=%s&incoming=%s&outgoing=%s

参数解释:

stage: 认证阶段,就logoin和counters两种

token: login页面下发的token

incoming: 下载流量

outgoing: 上传流量

/auth/index.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";

}

3.Ping协议

/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

echo "Pong";

?>

4.认证成功后的跳转

portal/?gw_id=%s

在认证成功后,wifidog会将用户重定向至该页面。

/portal/index.php

//认证前用户访问任意url,然后被重定向登录页面,session记录的是这个“任意url”.

$url = $_SESSION["url"];//如果login参数url保存到session中

//跳转到登陆前页面.

header("Location: ".$url);

5.若验证失败,则会根据失败原因跳转至如下页面

gw_message.php?message=denied

gw_message.php?message=activate

gw_message.php?message=failed_validation

/gw_message.php

$message = null;

if(isset($_GET["message"])){

$message = $_GET["message"];

}

echo $message;

?>

总结

wifidog的认证流程是:

用户连上wifi,发起一个访问网站的请求,如:segmentfault.com

网关根据防火墙规则,将请求重定向本地(路由器的ip)的wifidog端口

wifidog重定向到认证服务器的认证页面

认证服务器返回登录页面让用户填写

用户填写后请求认证

认证服务器根据用户提供数据确定是否符合要求

如果符合要求,认证服务器将用户重定向路由器网关并携带token

网关向认证服务器确定用户信息

如果符合要求,服务器返回用户登录成功的页面

用户正常上网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值