分类 wifidog服务器 下的文章

编写自己的WifiDog认证服务器

这次我使用的是php来编写auth_server服务器,因为这样比较简单。
1.首先是login.php

<?php  
include './tool/MySQLHelper.php';  
if (!empty($_GET["mac"])){  
    $result = selectMacByToken($_GET["mac"]);  
    if (!empty($result)){  
        header("location: http://192.168.1.1:2060/wifidog/auth?token=".$result);  
    }  
    else {  
        header("location: http://xxxxx/WelcomePage.php?mac=".$_GET["mac"]);  
    }  
}  
else {  
    header("location: http://xxxxx/WelcomePage.php?mac=".$_GET["mac"]);  
}  
?>  

2.ping.php

<?php  
echo "Pong";  
?>  

这里没有做额外的处理,只是简单地向wifidog回应一个Pong。
3.auth.php

<?php  
// 后门  
if ($_GET["token"] == "123"){  
    echo "Auth: 1";  
    return;  
}  

if (!empty($_GET["token"]) && isset($_GET["token"])){  
    //获取$result的过程//  
    isValidate($result);  
    //**后续处理**//  
    return;  
}  
else if((!empty ($_GET["mac"])) && isset($_GET["mac"])){  
    //**获取result*//  
    $result = isSubscribeByMac($_GET["mac"]);  
    isValidate($result);  
    return;  
}  
else  
{  
    echo "Auth: 0";  
}  

// 输出是否合法.  
function isValidate($result){  
    if ($result == 1){  
        echo "Auth: 1";  
    }  
    else {  
        echo "Auth: 0";  
    }  
}  
?>  

这里根据一些参数来获取$result,从而决定是否允许认证。
4.welcomePage.php以及Portal.html就不一一列举了。

本文章由 http://www.wifidog.pro/2015/06/08/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8-4.html 整理编辑,转载请注明出处

wifidog用php实现验证流程

步骤
1.首先简单说说wifidog认证的过程
客户端首次连接到wifi后,浏览器请求将会被重定向到:

login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s

验证通过后,客户端被重定向到网关,url格式如下:
http://网关地址:网关端口/wifidog/auth?token=
wifidong会启动一个线程周期性地报告每一个用户的状态信息,并通过如下地址发送给认证
服务器:

auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=

认证服务器根据该状态信息决定是否允许该用户继续连接,并回复网关,回复格式为:Auth:状态码,
如:Auth:1
常用状态码:
0:AUTH_DENIED,表示拒绝
1:AUTH_ALLOWED,验证通过
验证通过后,将重定向到如下地址:
portal/?gw_id=%s
wifidog的ping协议
wifidog通过ping协议将当前状态信息发送给认证服务器,发送地址为:

http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu

认证服务器须返回一个“Pong”作为回应。
具体php实现代码如下

public function auth()
    {
        //响应客户端的定时认证,可在此处做各种统计、计费等等
        /*
            wifidog 会通过这个接口传递连接客户端的信息,然后根据返回,对客户端做开通、断开等处理,具体返回值可以看wifidog的文档
        wifidog主要提交如下参数
        1.ip
        2. mac
        3. token(login页面下发的token)
        4.incoming 下载流量
        5.outgoing 上传流量
        6.stage  认证阶段,就两种 login 和 counters
        */


        $stage = $_GET['stage'] == 'counters'?'counters':'login';
        if($stage == 'login')
        {
            //XXXX跳过login 阶段的处理XXXX不能随便跳过的
            //默认返回 允许
            echo "Auth: 1";
        }
        else if($stage == 'counters')
        {

            //做一个简单的流量判断验证,下载流量超值时,返回下线通知,否则保持在线
            if(!empty($_GET['incoming']) and $_GET['incoming'] > 10000000)
            {
                echo "Auth: 0";
            }else{
                echo "Auth: 1\n";
            }
        }
        else
            echo "Auth: 0"; //其他情况都返回拒绝


        /*
            返回值:主要有这两种就够了
        0 - 拒绝
        1 - 放行

        官方文档如下
        0 - AUTH_DENIED - User firewall users are deleted and the user removed.
        6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted(用户邮件验证超时,防火墙关闭该用户)
        1 - AUTH_ALLOWED - User was valid, add firewall rules if not present
        5 - AUTH_VALIDATION - Permit user access to email to get validation email under default rules (用户邮件验证时,向用户开放email)
        -1 - AUTH_ERROR - An error occurred during the validation process
        */
    }
    public function portal()
    {
        /*
         wifidog 带过来的参数 如下
        1. gw_id
        */
        //重定到指定网站 或者 显示splash广告页面
        redirect('http://www.baidu.com', 'location', 302);

    }
    public function ping()
    {
        //url请求 "gw_id=$gw_id&sys_uptime=$sys_uptime&sys_memfree=$sys_memfree&sys_load=$sys_load&wifidog_uptime=$wifidog_uptime";
        //log_message($this->config->item('MY_log_threshold'), __CLASS__.':'.__FUNCTION__.':'.debug_printarray($_GET));

        //判断各种参数是否为空
        if( !(isset($_GET['gw_id']) and isset($_GET['sys_uptime']) and isset($_GET['sys_memfree']) and isset($_GET['sys_load']) and isset($_GET['wifidog_uptime']) ) )
        {
            echo '{"error":"2"}';
            return;
        }
        //添加心跳日志处理功能
        /*
            此处可获取 wififog提供的 如下参数
        1.gw_id  来自wifidog 配置文件中,用来区分不同的路由设备
        2.sys_uptime 路由器的系统启动时间
        3.sys_memfree 系统内存使用百分比
        4.wifidog_uptime wifidog持续运行时间(这个数据经常会有问题)
        */

        //返回值
        echo 'Pong';
    }
    /**
     * wifidog 的gw_message 接口,信息提示页面
     */
    function gw_message()
    {
        if (isset($_REQUEST["message"])) {
            switch ($_REQUEST["message"]) {
                case 'failed_validation':
                    //auth的stage为login时,被服务器返回AUTH_VALIDATION_FAILED时,来到该处处理
                    //认证失败,请重新认证
                    break;
                case 'denied':
                    //auth的stage为login时,被服务器返回AUTH_DENIED时,来到该处处理
                    //认证被拒
                    break;
                case 'activate':
                    //auth的stage为login时,被服务器返回AUTH_VALIDATION时,来到该处处理
                    //待激活
                    break;
                default:
                    break;
            }
        }else{
            //不回显任何信息
        }
    }

本文章由 http://www.wifidog.pro/2015/04/09/wifidog-php-2.html 整理编辑,转载请注明出处

wifidog认证wifidog流程auth server简单配置

前段时间使用wifidog进行wifi强制认证,现在做个小结。
1.首先简单说说wifidog认证的过程
客户端首次连接到wifi后,浏览器请求将会被重定向到:

login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s

验证通过后,客户端被重定向到网关,url格式如下:
http://网关地址:网关端口/wifidog/auth?token=
wifidong会启动一个线程周期性地报告每一个用户的状态信息,并通过如下地址发送给认证
服务器:

auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=

认证服务器根据该状态信息决定是否允许该用户继续连接,并回复网关,回复格式为:Auth:状态码,
如:Auth:1
常用状态码:
0:AUTH_DENIED,表示拒绝
1:AUTH_ALLOWED,验证通过
验证通过后,将重定向到如下地址:
portal/?gw_id=%s
wifidog的ping协议
wifidog通过ping协议将当前状态信息发送给认证服务器,发送地址为:

http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu

认证服务器须返回一个“Pong”作为回应。
2.实战应用
struts配置文件:

<package name="index" namespace="/" extends="interceptorMy,struts-default">
<action name="login/" class="goodsAction" method="login">
<result name="success" type="redirect">/Login/index.jsp</result>
<result name="input">/error.jsp</result>
</action>
<action name="ping/" class="goodsAction" method="ping">
</action>
 <action name="auth/" class="goodsAction" method="auth">
</action>
<action name="portal/" class="goodsAction" method="portal">
</action>
</package>

Action方法

public String login() {
    try{
        System.out.println("login start!");
                System.out.println("gw_port:"+gw_port);
        System.out.println("login end!");

     }
    catch(Exception e)
    {
        e.printStackTrace();
        return INPUT;
    }
    return "success";
}
public void ping() {
    try{
        System.out.println("ping start!");
        System.out.println(gw_id);
        ServletActionContext.getResponse().getWriter().write("Pong");
        System.out.println("ping end!");
         }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
public void portal() {
    try{
        System.out.println("portal start");
        System.out.println("protal"+token);
    ServletActionContext.getResponse().sendRedirect("/demo/listAction");
        System.out.println("portal end");
     }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
public void auth() {
    try{
        System.out.println("auth start!");
        System.out.println("mac"+mac);
        System.out.println("stage"+stage);
        System.out.println("token"+token);
        ServletActionContext.getResponse().getWriter().write("Auth: 1");
        System.out.println("auth end!");

     }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

/Login/index.jsp代码:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    DateFormat format=new SimpleDateFormat("yyMMddHHmmss");
    String formatData=format.format(new Date());
    int ramdom=new Random().nextInt(1000);
    String token=formatData+ramdom;
    if(session.getAttribute("token")==null)
       session.setAttribute("token",token);

%>
<form method="GET" action='http://192.168.1.1:2060/wifidog/auth'>
<input type='hidden' name='token' value="<s:property value="#session.token" />" />
<input type='submit' value='Welcome!'/>
</form>

上面的192.168.1.1为网关的ip,2060为网关端口。
当然,完全可以在处理完login后直接跳到该地址。我们这里为演示其认证流程,故跳到该页面
效果:
客户端连接到wifi后,打开任何连接均跳到上面的index.jsp中,点击"Welcome"后,跳到/demo/listAction,即我们的目标地址。此后点击其他连接将不再拦截。
提示:安装wifidog的路由器必须可以访问Internet,否则wifidog拦截失败,无法跳到我们设定的页面。

本文章由 http://www.wifidog.pro/2015/04/08/wifidog%E6%B5%81%E7%A8%8Bwifidog%E8%AE%A4%E8%AF%81.html 整理编辑,转载请注明出处

wifidog认证服务器家用环境下部署(java版)

本文所讲的是基于一个java版wifidog认证服务器的开源项目,在windows环境下搭建wifidog认证服务器配合固件实现用户名密码的认证。

大致步骤如下:

一,准备

  1.搭建硬件及网络环境

    a.需要普通路由器1个,刷了带wifidog固件的路由器一个,Windows电脑一台,网线若干,宽带网络。

    b.按照一定的拓扑结构进行搭建:普通路由器连接Internet,wifidog路由器连接到普通路由器LAN,PC接到wifidog路由器LAN

 2.获取软件及工具并安装

    a.获取并安装jdk6

    b.获取并安装MySQL

    c.安装MyEclipse

    d.获取java版wifidog认证服务器源码(https://github.com/C-hill/java4wifidog_server)

二,部署与调试

  3.部署

  因为MyEclipse自带了Tomcat插件,所以直接用MyEclipse的Tomcat插件进行部署。

    a.打开MyEclipse,导入源码,部署到Tomcat

    b.配置Tomcat中server.xml文件(该步骤主要是为了实现wifidog的接口标准)

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 
    <Context path="" docBase="部署路径(绝对路径或appBase的相对路径)" debug="0" reloadable="true"/> 
</Host>

    c.创建数据库并执行wifidog.sql脚本,配置db.properties文件。

4.调试

    a.在浏览器中输入“localhost:8080”,出现页面,则服务器部署成功

   b.路由器设置

      通过cmd查看电脑的ip地址。

      输入192.168.0.1进入路由器管理界面进行配置。

      配置认证服务器url为:电脑ip。

      配置服务器端口为:8080。

      开启wifidog。

    c.验证wifidog是否有效

      在浏览器打开任意网址,正常情况下都会跳转到认证登录页面

这里已经实现了用户名密码认证,接下来可以通过测试接口添加用户名密码,然后输入用户名密码即可上网。具体步骤如下:

     打开localhost:8080进入测试接口首页,进入user接口后,如下图可以看到增加用户的接口,需要参数“device_token”,该参数对应的是表“ap”中的字段“dev_md5”,所以可以到数据库中获取对应的“dev_md5”然后填入,参数“username”,“password”自行定义即可。

      添加完用户名密码后,即可通过在认证页面输入该用户名密码实现认证上网。

本文章由 http://www.wifidog.pro/2015/04/03/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2.html 整理编辑,转载请注明出处