首页 > 经验心得 > wifidog的认证服务器php源码
2015
11-26

wifidog的认证服务器php源码

wifidog php源码主要设置鉴权服务器主机名(域名或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.首先是重定向,在首次登陆时,用户访问的url会被重定向到如下的地址: /login/index.php

<?php parse_str($_SERVER[ 'QUERY_STRING'], $parseUrl); 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=n ew 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) ]; (auth/index.php) $time=t ime(); $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{ $url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; header("Location: ".$url); } }else{ $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="http://segmentfault.com/a/submit" />

            </form>

        </body>

        </html>EOD; echo $html; }


2.用户认证协议:

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

参数解释: 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";

3.Ping协议

/ping/?gw_id=%s&sys_uptime=%lu&sys_memfree=%u&sys_load=%.2f&wifidog_uptime=%l

wifidog会向认证服务器发送一些信息,来报告wifidog现在的情况,这些信息是通过Http协议发送的,如上的链接所示,参数大概如字面意思,没仔细研究过,而作为认证服务器,auth_server应回应一个"Pong"。 主要作用是路由确认认证服务器仍然存活,没有死机,另外一个功能是认证服务器可以收集路由的负载等的信息。路由器会定时访问这个脚本,脚本必须回复Pong,否则将认为认证服务器失效而出错。 /ping/index.php

<?php

echo "Pong";

?

4.认证成功后的跳转

portal/?gw_id=%

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

<?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

<?php

    $message = null;

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

        $message = $_GET["message"];

    }

    echo $message;

?

免费支持本站

支付宝打赏微信打赏