我们去大多数机场或者一些公共场合的时候,会看到很多公共的WIFI热点需要进行手机号的短信认证登录,那么我们如何去构造这样一个系统呢?
这里介绍一种技术——wifidog,其提供了一套这样的解决方案,适用于openwrt和ddwrt,其包括了两个部分路由端需要安装的插件,以及一个提供的基于XMPP的web解决方案,我看了下觉得如果使用它提供的web解决方案的话,非常不方便,因为这样的技术一般只要弄清楚其通信的机制和协议就可以了,所以在文档中找到了其通信的协议,之后我会加以说明其相关的协议。
具体的原理是怎样?又是如何实现的。
首先我们需要一个可以进行命令行管理操作的路由器,比如刷过类似于openwrt或者ddwrt这种系统的路由器,这样的一个系统类似于一个小的Linux系统,如果我们可以进行命令行的控制,那么我们就可以安装一系列的软件了,这里我们通过给路由器安装wifidog,实现构建这样一个WIFI认证的系统。那么wifidog是如何实现整个过程的呢?
如何限制用户上网
简单来讲就是路由层会将所有的用户mac地址进行一个名单的控制,所以在未登录认证之前,然后wifidog可以配置一个登录授权的服务器地址,用户不在白名单列表里,就会被重定向到这个网址。
一般来讲,其实所有的网络访问应该都是不可以的,但是借助于iptables的管理,路由器可以设定一些ip以及相关协议(tcp, udp)的白名单,所以对于认证过程中可能设计到网页,包括中间需要网络请求提交的地址(例如新浪或者QQ等第三方的登录授权)都需要加入到访问网络地址的白名单里面。这样可以保证用户基本的网络访问权限的限制吗,但是同时又不影响网络的授权。
如何进行认证
当用户被重定向到了认证的网页之后,剩下的操作就在认证服务器端进行了,但需要保证的是,因为现在用户的基本网络访问权限是被限制住的,所以中间所有涉及到的网络请求地址都需要按照上面说的给加入到白名单里面,否则因为一些请求发送不出去,所以不能完成认证。
对于认证的过程,根据上述的描述,因为认证操作都在认证服务器端,所以可以保证认证过程是非常灵活。就比如说 我们常见的是短信验证码的认证,除此之外,我们可以用新浪微博登录,微信添加帐号,动态密码,豆瓣人人登录等等,因为一般第三方登录都是基于XOAuth或者OAuth2.0认证,所以一般都是无非有一个登录的地址,然后一个回调的地址,但是需要注意的是,第三方登录页面会有一些JS或者CSS资源之类的,这些资源可能不在同域下面,而一些图片显示,最重要登录验证提交都是在JS里面,所以也需要抓包分析一下地址,进行路由器的配置白名单。
如何实现用户认证之后打开网络权限以及用户控制
现在很多人可能有疑问是,认证操作是在服务器端进行的,那么认证通过后,认证服务器是如何告知路由器用户已经通过授权呢?
其实因为用户此时在内网,所以wifidog的解决方案是,在内网的一个ip地址开了一个端口(一般是2620),接受HTTP的请求,所以认证服务器认证成功之后需要给用户生成一个唯一的token标识,然后重定向到这个http请求地址并带上参数即可。
然后路由器这边接受到了请求之后,就会认为这个用户(实际判断是mac地址)可以进行网络访问,但是呢,实际上也不会这么直接开放用户网络权限,因为一般来说我们用CMCC的话是不是会看到用户已经上网的时长呢,所以这里wifidog也提供了一个用户的控制,具体是怎样的呢?
就是在用户认证成功之后,路由器不是得到了用户的token吗,然后token和mac以及ip可以构成唯一,所以路由器会周期性地把这三个值以及连接信息(其他参数)一起发给认证服务器,认证服务器通过返回值来判定该用户当前的状态,比如是可以继续网络访问呢,还是拒绝,还是验证失败,还是出错等等,来控制用户的访问权限。
例如实现三个小时剔除用户的话,就可以从用户认证通过开始计时,如果超过三小时,当路由器三小时后周期性发来验证信息的时候,可以返回拒绝,然后用户就会被踢下线。
整个逻辑也就是: 用户认证服务器通过后,会重定向到路由器的http认证地址,路由器获取用户的token,开始对其进行周期性的验证,由认证服务器对其进行鉴权。
路由器和认证服务器的心跳包保持在线
有的时候因为需要判断路由器这边的认证授权控制是否正常工作,所以路由器会一直对认证服务器进行心跳包的发送,可以让认证服务器监控到路由器是否正常工作。
以上就是借助wifidog的原理,对WIFI认证登录控制的整个限制的过程分析,这里主要是基于wifidog v1的协议和原理。 欢迎多多交流。
本文章由 http://www.wifidog.pro/2015/02/11/wifidog-cmcc.html 整理编辑,转载请注明出处